FB 연결을 수행하는 올바른 방법인가요? '페이스북으로 로그인' Stingy 계정 fb connect php

로그인 API (3)

링크가 정상적으로 작동하지 않도록 하려면 false를 반환해야 한다고 생각합니다. 리디렉션과 관련하여 내 사이트에서 다음을 수행합니다.

로그 아웃

logoutAndRedirect가 작동하지 않는 이유를 완전히 확신할 수는 없지만 이 게시물에서 약간의 정보를 얻을 수 있습니다: http://forum.developers.facebook.com/viewtopic.php?id=38549.

내 초기화 문자열:

function initFB ()( FB_RequireFeatures ([ "XFBML" ], function ()( FB . init ( "xxxx" , "xd_receiver.htm" );));)

내 로그아웃:

로그 아웃

내 사용자가 사진 쇼를 보여주기 때문에 내 webapp에 유효한 세션과 유효한 Facebook 세션이 있습니다.

Facebook이 이 함수 또는 .logout()에서 제대로 로그아웃하도록 할 수 있는 유일한 방법은 던지는 것입니다.

거짓을 반환 ;

다음과 같이 혼합물에 넣습니다.

로그 아웃

그러나 이것은 여전히 ​​어디로도 리디렉션되지 않습니다. 앱은 Facebook에서 로그아웃한 후에도 그대로 유지되므로 사이트 세션은 여전히 ​​살아 있고 중단되어 있습니다.

정말 실망스럽습니다. 따라서 리디렉션되지 않는 이유를 설명할 수 있는 사람이 있다면 귀담아듣겠습니다.

Facebook 로그아웃을 실행하고 올바르게 리디렉션하기 위해 누군가가 작성한 함수를 찾았습니다. 이것은 훌륭하게 작동합니다.

자바스크립트 코드: function fBlogout ()( try ( FB . Connect . ifUserConnected (function ()( FB . Connect . logoutAndRedirect (); ), "http://fullurl.com/account/logout" ); ) catch ( e ) ( 위치 . href = "http://fullurl.com/account/logout" ; ) ) HTML 링크:< a href = "#" onclick = "FBlogout(); return false;" >로그아웃을 위한 PHP 코드: $facebook ->expired_session(); $facebook -> 로그아웃(MAIN_SITE_URL);

이는 거의 모든 브라우저에서 작동합니다.

Var xhr=new XMLHttpRequest(); xhr.onload=function())( console.log(xhr.responseText); ) xhr.open("GET","https://12Me21.github.io/test.txt"); xhr.send();

또한 새로운 Fetch API가 있습니다.

Fetch("https://12Me21.github.io/test.txt") .then(response => response.text()) .then(text => console.log(text))

그래서 재미삼아 프로젝트를 개발하기 시작했습니다. 프로젝트의 주요 아이디어는 간단합니다. 모든 사람이 어떤 제한 없이 무엇이든 베팅하고, 베팅하고, 거래할 수 있는 플랫폼입니다. 핵심은 재미있는 프로젝트입니다.

그리고 물론 마찰을 최소화하면서 편리한 사용자 인증에 대한 문제도 있었습니다. 조금 생각한 후에 Facebook을 통한 승인을 선택했지만 여기서 멈추지 않고 Google Acc, VK 및 Tweet을 통해 승인이 포함된 기사를 몇 개 더 읽을 것입니다.

그럼 사업을 시작합시다! 인터넷에서 인증 문제를 설명하는 여러 주제를 찾았고 일부 정보가 도움이 되었지만 제가 설정한 문제를 해결할 수 있는 주제를 찾지 못했기 때문에 작업을 완료한 후 이 기사를 쓰기로 결정했습니다.

완료: 사용자 정의 버튼을 한 번 클릭하여 데이터베이스에 사용자를 등록하고 사이트에 대한 권한을 부여합니다(원하는 사진).

1. FB에 애플리케이션 등록:a. https://developers.facebook.com/apps/
비. 우리는 신청서를 등록하고, 귀하의 웹사이트 주소, 응답 데이터 승인 페이지 등을 입력합니다. 인터페이스는 매우 친절하고 Facebook은 우리를 좋아합니다. 그러므로 나는 모든 것과 모든 사람을 설명하지 않을 것입니다. 거기에서 우리는 필요합니다 애플리케이션 ID 및 웹사이트 주소. 2. 프런트 엔드: 내 웹사이트에서 전체 작업 예제를 제공합니다. 링크를 클릭하면 함수가 호출됩니다: "fb_login()", 이 함수는 먼저 "사용자가 Facebook에 로그인되어 있습니까?"를 확인합니다. YES인 경우 해당 ID를 가져와 Ajax를 통해 BackEnd로 보내고, NO인 경우 Facebook 계정에 로그인하기 위한 양식을 호출합니다.

Fb_login() - FB와의 통신을 시작합니다.
handler_fb_data() - FB에서 받은 사용자 데이터를 BackEnd로 수신하고 전송하는 작업을 처리합니다.

function handler_fb_data(response)( FB.api("/me", function(response) ( console.log("성공적인 로그인: " + response.name); console.log("FB에서 도착: "+JSON.stringify (응답)); // 경고("FB에서: "+JSON.stringify(응답)) $.ajax(( 유형: "post", url: "/do/reg/fb", 데이터: 응답, 성공 : function(msg) ( console.log(msg); if ((msg=="registered")||(msg=="logged in"))(window.location.reload();) ), 오류: 함수 ()() )) )); function fb_login())( FB.getLoginStatus(function(response) ( if (response.authResponse) ( console.log("환영합니다! 정보를 가져오는 중입니다.... "); handler_fb_data( response); 정보.... "); handler_fb_data(response); ) else ( console.log("사용자가 FB를 통해 로그인하는 것에 대해 마음을 바꾼 것 같습니다."); ) )); ) ), ( 범위: "email,id" )); ) window .fbAsyncInit = function() ( FB.init(( appId: "(여기에 애플리케이션 ID 삽입)", cookie: true, // 서버가 액세스할 수 있도록 쿠키를 활성화합니다. session xfbml: true, // 이 페이지의 소셜 플러그인을 구문 분석합니다. version: "v2.8" // 그래프 API 버전 2.8을 사용합니다. )); ); // SDK를 비동기식으로 로드합니다. (function(d, s, id) ( var js, fjs = d.getElementsByTagName(s); if (d.getElementById(id)) return; js = d.createElement(s); js. id = id; js.src = "//connect.facebook.net/en_US/sdk.js"; fjs.parentNode.insertBefore(js, fjs);
이제 프론트엔드에 관한 내용은 여기까지입니다. 이제 백엔드를 살펴보겠습니다.

3. BACK END public function fb())( if (($this->session->userdata("logged_in") != true))( // 1. 사용자가 이미 로그인한 경우에는 아무 작업도 수행하지 않습니다. // 2. 그렇지 않다면 데이터베이스에 이 FB_ID를 가진 사용자가 있는지 확인합니다. // 있다면 로그인합니다. // 3. 데이터베이스에 사용자가 없으면 먼저 등록한 후 즉시 로그합니다. in // 그래서 우리는 특정 사용자에 대한 데이터베이스의 모든 것을 꺼내서 그의 세션에 모든 것을 입력합니다. 즉, "login" $query = $this->db->get_where("users", array("fb_id" => $_POST["id"])); if ($query->num_rows() > 0) ( foreach ($query->row_array() as $key => $value) ( ​​​​$userdata[$key ] = $value; ) $userdata["logged_in"] = true; //사용자가 세션의 트랜잭션에 대한 정보를 가지고 있는지 확인하고, 그렇다면 사용자를 트랜잭션에 추가합니다. >userdata("bet_code_last") != false) ( $data = array("start_user_id" => $userdata["id"]); $this->db->where("bet_code", $this->session- >userdata("bet_code_last")); >update("bet", $data); $this->session->sess_destroy(); ) $this->session->set_userdata($userdata); echo "로그인되었습니다"; ) else ( $data = array("fb_id" => $_POST["id"], "lang" => "en", "name" => $_POST["name"],); // 다음과 같다고 가정합니다. 사용자 이름에 러시아어 문자가 포함되어 있으면 러시아어 인터페이스 언어가 더 편리합니다. if(preg_match("/[ёа-я]/i", $_POST["name"]))($data["lang"] ="ru ​​";) $this->db->insert("users", $data); // 위 줄은 데이터베이스에 등록했고, 아래 줄은 사용자를 로그인했습니다.;) $data["logged_in" ] = 사실; $this->세션->set_userdata($data); echo "등록됨"; ) )else(echo "이미 로그인했습니다.";) )
PHP 코드는 Codeigniter 프레임워크의 데이터베이스 액세스 기능을 사용합니다. 글쎄, 나는 일반적으로 전체 과정을 설명했습니다. 그것이 매우 명확하고 이해하기 쉽기를 바랍니다. 참고: 1. 그런 다음 엄청난 노력을 기울여 먼저 상태를 확인한 다음 어떤 설명에도 명시적으로 언급되지 않은 로그인 양식(프론트 엔드에서)을 호출하는 것이 더 낫다는 것을 알아냈습니다.

2. 데이터가 세션에 입력된 후에도 페이지는 여전히 업데이트되지 않으므로 백엔드가 필요한 모든 작업을 완료했음을 확인하는 순간에 다음 줄로 업데이트합니다.
if ((msg=="등록됨")||(msg=="로그인됨"))(window.location.reload();)

관심을 가져주셔서 감사합니다!

반드시 SDK를 사용하세요. 장점은 이것이 야생에서 테스트되고 사용되는 라이브러리라는 것입니다. 필요하지 않을 때 휠을 다시 정렬하지 마십시오(더 많은 작업을 수행하게 될 것입니다;)).

CI에서 결국 내가 한 일은 PHP PHP SDK를 내 라이브러리 디렉토리에 추가하고 Facebook 클래스의 __construct 함수를 변경하는 것이었습니다.

공용 함수 __construct() ( $ci =& get_instance(); $this->setAppId($ci->config->item("fb_appId")); $this->setApiSecret($ci->config->item( "fb_secret")); $this->setCookieSupport($ci->config->item("fb_cookie")); $this->setBaseDomain($ci->config->item("fb_domain")); setFileUploadSupport($ci->config->item("fb_upload"));

이 작업이 완료되면 $this->facebook 을 통해 내 애플리케이션의 어느 곳에서나 FB API에 액세스할 수 있었습니다.

하지만 이것은 모두 2.0 이전의 것이므로 필요한 경우 어떤 변경이 필요할지 완전히 확신할 수 없습니다. (현재 Yii를 사용하고 있기 때문에 변경이 필요한지 모르겠습니다 :))

도움이 되었기를 바랍니다.

클래스 UserModel 확장 모델( private $m_user; public function UserModel() ( parent::Model(); $this->m_user = null; $session = $this->facebook->getSession(); if($session) ( if($this->facebook->api("/me") != null) ( $this->m_user = $this->facebook->api("/me"); ) ) ) 공용 함수 getUser() ( return $this->m_user; ) public function isLoggedIn() ( return $this->getUser() != null; ) // 해당 공급자의 상태를 기준으로 해당 공급자의 로그인 또는 로그아웃 URL을 반환합니다. 현재 사용자 개체는 공용 함수 getActionUrl() ( if($this->isLoggedIn()) ( return $this->facebook->getLogouturl(); ) else ( return $this->facebook->getLoginUrl(array(" next"=>currentUrl(), "cancel"=>currentUrl(), "req_perms"=>null, "display"=>"popup")); ) ) )

로그 아웃

두 번째 편집:

죄송합니다. 이 글을 쓴 지 꽤 시간이 지났기 때문에 돌아가서 이것이 어떻게 구현되었는지 알아내야 했습니다. :P 빠른 grep 후에 getActionUrl을 전혀 사용하지 않는다는 것을 발견했습니다. FB에서 로그인/로그아웃 이벤트를 수신하기 위해 몇 가지 클라이언트 스크립트를 추가했습니다.

Google.setOnLoadCallback(on_load); google.load("jquery", "1.4.4"); window.fbAsyncInit = function() ( FB.init((appId: "", status: true, cookie: true, xfbml: true)); FB.Event.subscribe("auth.login", on_fb_login); FB.Event .subscribe("auth.logout", on_fb_logout); function on_load() ( // "ext" 관계 태그가 있는 모든 앵커를 외부 창에서 열도록 강제합니다. // (target= 기능 대체) $("a").click(function())( window.open(this . href); false 반환; )); 함수 on_fb_login() ( location.reload(); ) 함수 on_fb_logout() ( location.reload(); )

내 웹사이트의 계정과 FB 계정 연결하기

도와주세요. 아니면 어디서부터 시작해야 하는지 힌트를 주세요. 왜냐하면 저는 2주 동안 이 문제로 싸워왔기 때문입니다. 우리 모두 알고 있듯이 페이스북에는 새로운 인증 시스템이 있습니다. 즉, 제 웹사이트에 이를 구현해야 한다는 뜻입니다. 작동 방식과 내 웹 사이트에서 구현하는 방법을 이해할 수 없습니다. 물론 인터넷과 개발자 페이지에 예제가 있다는 것을 알고 있습니다. 모두 읽었지만 여전히 내 웹사이트의 계정을 FB 계정과 연결하는 방법을 모릅니다. 아마도 다루어야 할 몇 가지 상황을 제시할 것입니다. 웹사이트에는 로컬 계정이 있습니다. 내 사용자 ID를 FB 사용자 ID와 연결할 수 있는 추가 DB 테이블이 있습니다. 그/그녀는 "페이스북으로 로그인"을 클릭하고 FB로 리디렉션되고 앱을 승인한 다음 내 웹사이트로 다시 리디렉션되어 새 사용자 계정을 만들고 내 웹사이트의 UID를 인증된 FB UID와 연결합니다. 상황 2: 어떤 사람이 내 웹사이트의 계정이 이미 일부 FB 계정에 연결되어 있습니다. 그/그녀가 "페이스북으로 로그인"을 클릭하면 내 웹사이트가 "링크" 테이블에서 FB uid를 찾아 해당 FB 계정에 연결된 사용자로 로그인합니다. 3: 사람 내 웹사이트에 FB 계정과 연결되지 않은 계정이 있습니다. "이 계정을 Facebook에 연결" 링크가 있는 내 웹사이트의 특별 패널로 이동하면 "링크"에 기록이 생성되는 내 웹사이트로 다시 리디렉션됩니다. 웹사이트의 uid를 facebook uid와 연결하는 테이블입니다. 연결을 완료하면 특수 패널에 "페이스북 계정에 연결되었습니다."라는 정보가 표시됩니다. 상황 4: 한 사람이 Facebook 계정에 연결된 계정으로 내 웹사이트에 로그인했습니다. 그/그녀는 내 웹사이트에서 몇 가지 작업을 수행하여 FB 담벼락에 메시지를 게시하게 됩니다. 따라서 TL;DR은 FB 계정과 내 웹사이트의 계정 사이에 경계를 설정하는 일반적인 기능입니다. 이전 API에서는 모든 것이 잘 작동했고 벽에 게시하는 데 사용할 수 있는 오프라인_액세스도 있었고 그에 대한 토큰도 없었습니다. 지금은.. 어디서 시작해야 할지, 어디서 어떻게 이 토큰을 저장해야 하는지, 어떻게, 어떤 경우에 가져오는지, 기존 계정을 연결하는 방법, 내 "링크"에서 기존 "경계"를 "업데이트"하는 방법을 모릅니다. " 테이블. 의사 코드의 간단한 힌트 또는 이 흐름이 어떻게 보이는지 1..2..3.. 단계 목록은 정말 도움이 될 것입니다. 왜냐하면 저는 인터넷에서 도움이 되는 정보를 찾을 수 없기 때문입니다. 이 새로운 API에 대한 모든 "예제" 또는 "자습서"는 웹사이트에서 FB 계정을 인증하는 방법을 알려주지만 이러한 계정을 실제로 무언가에 연결하거나 이 연결을 데이터베이스에 저장하는 방법은 알려주지 않습니다. 최신 PHP Facebook SDK를 사용합니다.

관련된 링크들

WordPress 페이지 템플릿 사이드바 제거
Php mvc -링크 리디렉션 문제
Laravel - 관계 시드
세션 배열 데이터를 얻는 방법 CodeIgniter
gd 라이브러리 PHP를 사용하여 이미지 크기를 늘리고 투명한 이미지 위에 겹쳐 놓습니다.

반드시 SDK를 사용하세요. 장점은 이것이 야생에서 테스트되고 사용되는 라이브러리라는 것입니다. 꼭 필요하지 않을 때는 휠을 다시 정렬하지 마세요(더 많은 일을 하게 될 것입니다;).

CI에서 결국 내가 한 일은 Facebook PHP SDK를 내 라이브러리 디렉터리에 추가하고 Facebook 클래스의 __construct 함수를 다음과 같이 변경하는 것이었습니다.

공용 함수 __construct() ( $ci =& get_instance(); $this->setAppId($ci->config->item("fb_appId")); $this->setApiSecret($ci->config->item( "fb_secret")); $this->setCookieSupport($ci->config->item("fb_cookie")); $this->setBaseDomain($ci->config->item("fb_domain")); setFileUploadSupport($ci->config->item("fb_upload"));

이 작업이 완료되면 $this->facebook 을 통해 내 애플리케이션의 어느 곳에서나 FB API에 액세스할 수 있었습니다.

하지만 이 모든 것은 2.0 이전의 일이므로 필요한 경우 어떤 변경 사항이 있을 지 완전히 확신할 수 없습니다(현재 Yii를 사용하고 있기 때문에 이것이 필요한지 모르겠습니다 :)).

도움이 되었기를 바랍니다.

요청에 따라 UserModel 클래스(모델 확장)를 추가하게 되었습니다. 여러 사용자에 대한 지원이 있으므로 모두 게시하지는 않겠습니다. 그러나 이것이 그 핵심이다:

클래스 UserModel 확장 모델( private $m_user; public function UserModel() ( parent::Model(); $this->m_user = null; $session = $this->facebook->getSession(); if($session) ( if($this->facebook->api("/me") != null) ( $this->m_user = $this->facebook->api("/me"); ) ) ) 공용 함수 getUser() ( return $this->m_user; ) public function isLoggedIn() ( return $this->getUser() != null; ) // 해당 공급자의 상태를 기준으로 해당 공급자의 로그인 또는 로그아웃 URL을 반환합니다. 현재 사용자 개체는 공용 함수 getActionUrl() ( if($this->isLoggedIn()) ( return $this->facebook->getLogouturl(); ) else ( return $this->facebook->getLoginUrl(array(" next"=>currentUrl(), "cancel"=>currentUrl(), "req_perms"=>null, "display"=>"popup")); ) ) )

로그 아웃

두 번째 편집:

불행하게도 이 글을 쓰는 동안이었기 때문에 다시 돌아가서 그것이 어떻게 구현되었는지 알아내야 했습니다 :P 빠른 grep 후에 저는 어디에서도 getActionUrl을 사용하지 않는다는 것을 발견했습니다. FB에서 로그인/로그아웃 이벤트를 수신하기 위해 몇 가지 스크립트를 추가했습니다.

Google.setOnLoadCallback(on_load); google.load("jquery", "1.4.4"); window.fbAsyncInit = function() ( FB.init((appId: "", status: true, cookie: true, xfbml: true)); FB.Event.subscribe("auth.login", on_fb_login); FB.Event .subscribe("auth.logout", on_fb_logout); function on_load() ( // "ext" 관계 태그가 있는 모든 앵커를 외부 창에서 열도록 강제합니다. // (target= 기능 대체) $("a").click(function())( window.open(this . href); false 반환; )); 함수 on_fb_login() ( location.reload(); ) 함수 on_fb_logout() ( location.reload(); )