offline_access deprecation 이후 액세스 토큰 유효성을 확장하는 방법
PHPoffline_access deprecation 이후 액세스 토큰 유효성을 확장하는 방법
offline_access 권한은 Facebook의 인증 흐름에서 사용되지 않으므로 권한없이 소위 오래 사용 된 액세스 토큰을 가져 오는 데 문제가 있습니다.
아파치 측 OAuth가 액세스 토큰을 생성 한 것은 오랫동안 지속될 것이라는 페이스 북의 문서에서 오바마 당선자가 사용하지 않는 것은 사실이지만 그렇지 않습니다.
내가 놓친 게 있니? 앱 설정의 일부 설정은 무엇입니까? 액세스 토큰의 만기 시간을 연장하기 위해 사용해야하는 특수 코드? 설명서를 이해함에 따라 서버 측 인증의 경우 사용자가 로그인하면 PHP SDK의 getAccessToken () 메소드를 통해 액세스 할 수있는 액세스 토큰을 오래 동안 사용할 수 있습니다.
해결법
-
==============================
1.수정 (2012 년 8 월 14 일) : 일주일 전에 공식적인 페이스 북 PHP SDK가 업데이트되었습니다. 함수 이름이 setExtendedAccessToken으로 변경되었으며 실제로 두 개의 활성 세션을 가질 위험을 제거하기 위해 나중에 세션을 삭제해야한다고 결정되었습니다. 또한이 함수는 더 이상 실제로 토큰을 반환하지 않고 지속성 데이터 내에 저장합니다. 따라서 나중에 getAccessToken 공용 함수를 사용하여 새 액세스 토큰을 얻을 수 있습니다. 공식 페이스 북 PHP SDK github 페이지에서 새 SDK를 다운로드하여 최신 버전인지 확인하십시오.
수정 (2012 년 8 월 14 일) : 일주일 전에 공식적인 페이스 북 PHP SDK가 업데이트되었습니다. 함수 이름이 setExtendedAccessToken으로 변경되었으며 실제로 두 개의 활성 세션을 가질 위험을 제거하기 위해 나중에 세션을 삭제해야한다고 결정되었습니다. 또한이 함수는 더 이상 실제로 토큰을 반환하지 않고 지속성 데이터 내에 저장합니다. 따라서 나중에 getAccessToken 공용 함수를 사용하여 새 액세스 토큰을 얻을 수 있습니다. 공식 페이스 북 PHP SDK github 페이지에서 새 SDK를 다운로드하여 최신 버전인지 확인하십시오.
원문 답변 :
base_facebook.php 파일에 새로운 public 함수를 추가했습니다.이 함수는 60 일 후에 만료되는 새로운 액세스 토큰을 반환합니다. 일반 액세스 토큰을받은 후에이 기능을 요청할 수 있습니다. 테스트하지는 않았지만 개발자 앱의 고급 설정에서 'deprecate offline_access'를 활성화해야한다고 가정합니다.
facebook 클래스 안의 base_facebook.php에 이것을 추가하고 호출하십시오. 그것은 나를 위해 작동합니다.
public function getExtendedAccessToken(){ try { // need to circumvent json_decode by calling _oauthRequest // directly, since response isn't JSON format. $access_token_response = $this->_oauthRequest( $this->getUrl('graph', '/oauth/access_token'), array( 'client_id' => $this->getAppId(), 'client_secret' => $this->getAppSecret(), 'grant_type'=>'fb_exchange_token', 'fb_exchange_token'=>$this->getAccessToken() ) ); } catch (FacebookApiException $e) { // most likely that user very recently revoked authorization. // In any event, we don't have an access token, so say so. return false; } if (empty($access_token_response)) { return false; } $response_params = array(); parse_str($access_token_response, $response_params); if (!isset($response_params['access_token'])) { return false; } return $response_params['access_token']; }
-
==============================
2.실제로 말한 것 :
실제로 말한 것 :
즉, 클라이언트 쪽 생성 된 토큰보다 약간 오래 걸리고 확장 토큰 (60 일)을 받으려면 수동으로 요청해야합니다.
https://graph.facebook.com/oauth/access_token? client_id=APP_ID& client_secret=APP_SECRET& grant_type=fb_exchange_token& fb_exchange_token=EXISTING_ACCESS_TOKEN
이 토큰은 여러 가지 이유로 여전히 무효화 될 수 있으며 How-To : 만료 된 액세스 토큰 처리 블로그 게시물에 설명되어 있습니다.
최신 정보: 2012 년 8 월 7 일부터 setExtendedAccessToken 메서드를 사용하여 수동으로 URL을 구성하고 세부 정보를 검색하는 대신 access_token을 확장 할 수 있습니다.
-
==============================
3.// facebook 로그인 팝업을위한 자바 스크립트 사용하기
// facebook 로그인 팝업을위한 자바 스크립트 사용하기
FB.login(function(response) { if (response.authResponse) { var accessToken = response.authResponse.accessToken;
// 1-2 시간 만료 시간을 가진 accesstoken을 얻습니다.
// accesstoken을 facebook 컨트롤러라는 컨트롤러에 넣었습니다.
$request = $this->getRequest(); $params = $request->getParams(); $token=$params['accessToken'];
// 액세스 토큰을 가져와 60 일간 연장합니다.
$conf = $this->getConfigs(); $appid = $conf['fbdetails']['appid']; $secret = $conf['fbdetails']['secret']; $baseurl = $conf['app']['baseurl'];
// 아래 코드를 실행 한 후 액세스 토큰 만료 시간이 60 일인 응답을 받게됩니다.
$token_url = "https://graph.facebook.com/oauth/access_token?client_id=".$appid."&client_secret=".$secret."&grant_type=fb_exchange_token&fb_exchange_token=".$token;
// 위의 응답은 구문 분석에 대해 제공됩니다.
$c = curl_init(); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($c, CURLOPT_URL, $token_url); $contents = curl_exec($c); $err = curl_getinfo($c,CURLINFO_HTTP_CODE); curl_close($c); $paramsfb = null; parse_str($contents, $paramsfb);
// 위의 실행 코드에서 내용을 파싱 한 후 새로운 확장 된 accesstoken이 저장됩니다.
$user_session = new Zend_Session_Namespace('fbuser'); $user_session->access_token = $paramsfb['access_token'];
// 세션에 저장됩니다.
$this->_redirect('/home');
// 좋은 코딩을해라.
-
==============================
4.서버 측 OAuth 호출을 통해 생성 된 액세스 토큰은 확장 된 (더 긴) 종류의 것이므로이를 교환 할 필요가 없습니다. 이미 확장 토큰입니다. 앱 설정에서 '오프라인 액세스 비추천'을 사용 설정하면됩니다. 이는 이전에 "오프라인 액세스 비과시 중단"이 비활성화 된 경우에만 필요합니다.
서버 측 OAuth 호출을 통해 생성 된 액세스 토큰은 확장 된 (더 긴) 종류의 것이므로이를 교환 할 필요가 없습니다. 이미 확장 토큰입니다. 앱 설정에서 '오프라인 액세스 비추천'을 사용 설정하면됩니다. 이는 이전에 "오프라인 액세스 비과시 중단"이 비활성화 된 경우에만 필요합니다.
그런 다음 Facebook을 통해 사용자를 인증하면 60 일 동안 액세스 토큰을 받게됩니다. 같은 날에 여러 번 인증하면 첫 번째 인증 만료 시간이 연장됩니다.
-
==============================
5.PAGE에 대해 절대로 만료되지 않는 액세스 토큰이 필요하면 여기에서 비슷한 질문에 대한 대답을 참조하십시오.
PAGE에 대해 절대로 만료되지 않는 액세스 토큰이 필요하면 여기에서 비슷한 질문에 대한 대답을 참조하십시오.
개발자 페이지에서
-
==============================
6.이는 페이지 액세스 토큰을 절대로 만료되도록 확장하고 사용자 액세스 토큰의 수명을 2 개월 후에 만료시키기위한 것입니다 ( '새 액세스 토큰').
이는 페이지 액세스 토큰을 절대로 만료되도록 확장하고 사용자 액세스 토큰의 수명을 2 개월 후에 만료시키기위한 것입니다 ( '새 액세스 토큰').
좋아, 그래서 약 일주일이 걸렸지 만 여기서 나의 해결책이있다. https://developers.facebook.com/tools/explorer/에서 access_token의 일부로 manage_page가 있는지 확인하십시오. 그 후에이 코드를 앱 ID, 비밀번호, 리디렉션과 함께 사용하십시오.
<?php app_id = "APP_ID"; $app_secret = "APP_SECERET"; $post_login_url = "REDIRECT_URL"; $code = $_REQUEST['code']; //Obtain the access_token with publish_stream permission if(empty($code)){ $dialog_url= "http://www.facebook.com/dialog/oauth?" . "client_id=" . $app_id . "&redirect_uri=" . urlencode( $post_login_url) . "&COMMA_SEPARATED_LIST_OF_PERMISSION_NAMES"; echo("<script>top.location.href='" . $dialog_url . "'</script>"); } else { $token_url="https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=". urlencode($post_login_url) . "&client_secret=" . $app_secret . "&code=" . $code; $response = file_get_contents($token_url); $params = null; parse_str($response, $params); $access_token = $params['access_token']; echo 'access token: ' . $access_token.'<br>'; if($access_token){ $token_url="https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=". urlencode($post_login_url) . "&client_secret=" . $app_secret .'&grant_type=fb_exchange_token' . "&fb_exchange_token=" . $access_token; $response = file_get_contents($token_url); $access_token = $params['access_token']; echo 'new access token: '.$access_token; } }*/ ?>
그런 다음 '새 액세스 토큰'을 복사하고 https://developers.facebook.com/tools/explorer/로 돌아가십시오. 새 액세스 토큰에서 액세스 토큰 필드로 이동할 수 있습니다. 그런 다음 제출을 클릭하십시오. 그 후 노드에서 + ____ 클릭이 보이고 계정까지 스크롤 한 다음 클릭하십시오. 액세스 토큰이 필요한 페이지를 찾아 액세스 키 필드에 복사하여 붙여 넣으십시오. 디버그를 클릭하면 절대로 만료되지 않습니다. 해당 토큰을 저장하면 앱을 비밀로 재설정하지 않는 한 유효합니다.
-
==============================
7.이전 답변에서 영감을 얻어 간단한 토큰 자체 갱신 프로그램을 작성했습니다. 먼저, 현재 토큰을 'token.sec'파일에 넣으십시오.
이전 답변에서 영감을 얻어 간단한 토큰 자체 갱신 프로그램을 작성했습니다. 먼저, 현재 토큰을 'token.sec'파일에 넣으십시오.
이 프로그램은 파일에서 토큰을 읽고 모든 것이 정상이면 새로운 토큰으로 업데이트합니다. 다른 프로그램에서는 토큰을 사용해야합니다.
$access_token = file_get_contents("token.sec");
여기 있습니다 :
<?php $app_id = "<your app id>"; $app_secret = "<your app secret>"; $access_token = file_get_contents("token.sec"); $token_url="https://graph.facebook.com/oauth/access_token?" . "grant_type=fb_exchange_token" . "&client_id=" . $app_id . "&client_secret=" . $app_secret . "&fb_exchange_token=" . $access_token; $ch = curl_init($token_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); if($response === false) { die ('Curl error: ' . curl_error($ch)); } // Close handle curl_close($ch); // parse the output parse_str($response, $params); if(!isset($params['access_token'])) { die("No access token"); } echo ("New token: $access_token\n"); // eveything looks OK rename("token.sec", "token.sec.back"); // just in case $myfile = fopen("token.sec", "w") or die("Unable to open file!"); fwrite($myfile, $access_token); fclose($myfile); ?>
마지막으로, crontab에 이것을 추가하여 한 달에 한 번 토큰을 갱신 할 수 있습니다.
0 0 1 * * cd /home/<path>; php exchangeToken.php
from https://stackoverflow.com/questions/8982025/how-to-extend-access-token-validity-since-offline-access-deprecation by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
PHP 키워드 'var'는 무엇을합니까? (0) | 2018.09.15 |
---|---|
PHP 클래스 란 무엇입니까? (0) | 2018.09.15 |
Laravel Eloquent를 사용하여 여러 where 절을 만드는 방법은 무엇입니까? (0) | 2018.09.15 |
배열을 포함하는 PHP 상수? (0) | 2018.09.15 |
preg_match (); - 알 수없는 수정 자 '+'[중복] (0) | 2018.09.15 |