Programing

Facebook 액세스 토큰이 여전히 유효한지 확인하는 방법이 있습니까?

crosscheck 2020. 10. 29. 07:50
반응형

Facebook 액세스 토큰이 여전히 유효한지 확인하는 방법이 있습니까?


내 사이트는 평생 액세스 토큰 ( offline_access)을 사용합니다. 그러나 사용자가 비밀번호를 변경하면 액세스 토큰이 재설정됩니다. Graph API를 호출하기 전에 현재 액세스 토큰이 유효한지 확인하는 방법이 있습니까? 시간 내 줘서 고마워.


기본적으로 FB는 사용자가이를 폴링하거나 케이스를 감지하고 재 인증이 발생하도록 사용자를 리디렉션하기를 원합니다. 성가 시지만 공식적인 :

(구, 오래된 링크. 아래 참조) https://developers.facebook.com/blog/post/500/

편집 : Facebook은 리디렉션없이 링크 구조를 변경했습니다. 놀랍지 않습니다.

https://developers.facebook.com/blog/post/2011/05/13/how-to--handle-expired-access-tokens/


오프라인, 페이스 북에 아무것도 보내지 않고-그렇게 생각하지 않습니다. 가장 쉬운 방법은 다음 주소로 요청을 보내는 것입니다.

https://graph.facebook.com/me?access_token=...

Facebook은 실시간 업데이트 구독도 지원 하지만이 상황에 어떻게 적용해야할지 모르겠습니다.


토큰 만료 시간을 알고 싶다면 아래와 같이 appid와 token을 사용하여 오픈 그래프 URL을 전달할 수 있습니다.

https://graph.facebook.com/oauth/access_token_info?client_id=APPID&access_token=xxxxxxxxx

토큰 디버그 서비스를 사용하여 토큰을 확인할 수 있습니다. 여기에서 살펴보세요.

https://graph.facebook.com/debug_token?input_token=INPUT_TOKEN&access_token=ACCESS_TOKEN

https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/


실시간 업데이트를 통해이 문제를 해결할 수 있지만 매우 복잡합니다. 기본적으로 1) 사용자가 앱을 제거했는지 또는 2) 사용자가 권한을 제거했는지 알려주는 업데이트를 구독 할 수 있습니다. 이것을 사용하여 faceboook 사용자의 현재 권한을 저장할 수 있습니다. 이렇게하면 사용자가 앱을 제거한 경우 액세스 토큰이 만료되었음을 알 수 있습니다.

실시간 업데이트는 실제로 Facebook에서 권장하는 권한 처리 방법입니다. 많은 앱이 페이지가로드 될 때마다 API를 호출하여 권한을 확인합니다. 이것은 느리고 신뢰할 수없는 경향이 있습니다.


        //When user access token expires user must be logged in and renew the access token him self.it is a Facebook policy 
        //you can overcome this by sending email to users who have expired access token.
        //create a table of successful sending to monitor sending process
        //if any failure happened with the user an email is sent to him to ask him to activate there account again.with a link to your subscription page.
        //and here is the code should be written on that page. 
         $app_id = "YOUR_APP_ID";
         $app_secret = "YOUR_APP_SECRET"; 
         $my_url = "YOUR_POST_LOGIN_URL";

        // known valid access token stored in a database 
        $access_token = "YOUR_STORED_ACCESS_TOKEN";

        $code = $_REQUEST["code"];

       // If we get a code, it means that we have re-authed the user 
       //and can get a valid access_token. 
       if (isset($code)) {
         $token_url="https://graph.facebook.com/oauth/access_token?client_id="
           . $app_id . "&redirect_uri=" . urlencode($my_url) 
           . "&client_secret=" . $app_secret 
           . "&code=" . $code . "&display=popup";
         $response = file_get_contents($token_url);
         $params = null;
         parse_str($response, $params);
         $access_token = $params['access_token'];
       }


       // Attempt to query the graph:
       $graph_url = "https://graph.facebook.com/me?"
         . "access_token=" . $access_token;
       $response = curl_get_file_contents($graph_url);
       $decoded_response = json_decode($response);

       //Check for errors 
       if ($decoded_response->error) {
       // check to see if this is an oAuth error:
         if ($decoded_response->error->type== "OAuthException") {
           // Retrieving a valid access token. 
           $dialog_url= "https://www.facebook.com/dialog/oauth?"
             . "client_id=" . $app_id 
             . "&redirect_uri=" . urlencode($my_url);
           echo("<script> top.location.href='" . $dialog_url 
          . "'</script>");
        }
        else {
          echo "other error has happened";
        }
      } 
      else {
      // success
        echo("success" . $decoded_response->name);
        echo($access_token);
      }

      // note this wrapper function exists in order to circumvent PHP's 
      //strict obeying of HTTP error codes.  In this case, Facebook 
      //returns error code 400 which PHP obeys and wipes out 
      //the response.
      function curl_get_file_contents($URL) {
        $c = curl_init();
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($c, CURLOPT_URL, $URL);
        $contents = curl_exec($c);
        $err  = curl_getinfo($c,CURLINFO_HTTP_CODE);
        curl_close($c);
        if ($contents) return $contents;
        else return FALSE;
      }

나는이 게시물을 살펴 보았고, 다음과 같은 매우 좋은 해결책을 찾았습니다.

GET graph.facebook.com/debug_token?
    input_token={token-to-inspect}
    &access_token={app_id}|{app_secret}

이 요청의 응답은 필요한 모든 것을 제공합니다.

  • 앱 ID- 토큰이 애플리케이션에서 가져온 것인지 확인합니다.
  • application name - which can be also checked
  • expires_at - token expiration time
  • is_valid - boolean for check up
  • user_id - which you can also compare and check

Just note that "|" sign must be there as a letter


Offline - it is not possible

Ask that user has given permission or not:

https://graph.facebook.com/{facebook-id}/permissions?access_token={access-token}

If access token is invalid then it will give error:

{  
   error:{  
      message:"The access token could not be decrypted",
      type:"OAuthException",
      code:190
   }
}

Otherwise it will give list of permission that user has given:

data:[  
   {  
      installed:1,
      ...... permission list......... 
      bookmarked:1
   }
]

Updating this as things have changed since OP:

You can debug access tokens here: https://developers.facebook.com/tools/debug/accesstoken?version=v2.5&q={access_token}


Otto's answer of the facebook post seems to be the official response on this question, however it uses straight PHP instead of the SDK and also uses JS to resolve the issue instead of PHP. If you are using PHP to check for a valid session you often need a PHP method of ensuring a valid session in order to continue.

The following code checks for the me object with the graph API. If an exception is thrown it destroys* the current Facebook session.

try{
    $facebook->api('/me');
}
catch( FacebookApiException $e ){
    $facebook->destroySession();
}

This forces later graph calls to instantiate a new Facebook session. This at least gives you access to public data so that you can render pages do not require FB user permissions:

$facebook->api('/userName');

To reobtain user permission access the user will need to login to your app (this is distinct from being logged into Facebook itself). You can do this with JS or with PHP:

$facebook->getLoginUrl();

*Note the destroySession() call is not in a tagged release of the PHP SDK yet. Use the master branch or patch it in.

참고URL : https://stackoverflow.com/questions/3845151/is-there-a-way-to-check-if-facebook-access-token-is-still-valid

반응형