복붙노트

offline_access deprecation 이후 액세스 토큰 유효성을 확장하는 방법

PHP

offline_access deprecation 이후 액세스 토큰 유효성을 확장하는 방법

offline_access 권한은 Facebook의 인증 흐름에서 사용되지 않으므로 권한없이 소위 오래 사용 된 액세스 토큰을 가져 오는 데 문제가 있습니다.

아파치 측 OAuth가 액세스 토큰을 생성 한 것은 오랫동안 지속될 것이라는 페이스 북의 문서에서 오바마 당선자가 사용하지 않는 것은 사실이지만 그렇지 않습니다.

내가 놓친 게 있니? 앱 설정의 일부 설정은 무엇입니까? 액세스 토큰의 만기 시간을 연장하기 위해 사용해야하는 특수 코드? 설명서를 이해함에 따라 서버 측 인증의 경우 사용자가 로그인하면 PHP SDK의 getAccessToken () 메소드를 통해 액세스 할 수있는 액세스 토큰을 오래 동안 사용할 수 있습니다.

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.서버 측 OAuth 호출을 통해 생성 된 액세스 토큰은 확장 된 (더 긴) 종류의 것이므로이를 교환 할 필요가 없습니다. 이미 확장 토큰입니다. 앱 설정에서 '오프라인 액세스 비추천'을 사용 설정하면됩니다. 이는 이전에 "오프라인 액세스 비과시 중단"이 비활성화 된 경우에만 필요합니다.

    서버 측 OAuth 호출을 통해 생성 된 액세스 토큰은 확장 된 (더 긴) 종류의 것이므로이를 교환 할 필요가 없습니다. 이미 확장 토큰입니다. 앱 설정에서 '오프라인 액세스 비추천'을 사용 설정하면됩니다. 이는 이전에 "오프라인 액세스 비과시 중단"이 비활성화 된 경우에만 필요합니다.

    그런 다음 Facebook을 통해 사용자를 인증하면 60 일 동안 액세스 토큰을 받게됩니다. 같은 날에 여러 번 인증하면 첫 번째 인증 만료 시간이 연장됩니다.

  5. ==============================

    5.PAGE에 대해 절대로 만료되지 않는 액세스 토큰이 필요하면 여기에서 비슷한 질문에 대한 대답을 참조하십시오.

    PAGE에 대해 절대로 만료되지 않는 액세스 토큰이 필요하면 여기에서 비슷한 질문에 대한 대답을 참조하십시오.

    개발자 페이지에서

  6. ==============================

    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. ==============================

    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
    
  8. from https://stackoverflow.com/questions/8982025/how-to-extend-access-token-validity-since-offline-access-deprecation by cc-by-sa and MIT license