programing

Facebook 페이지에 대한 "만료되지 않는"액세스 토큰 생성

itsource 2021. 1. 15. 08:10
반응형

Facebook 페이지에 대한 "만료되지 않는"액세스 토큰 생성


API (C #)를 통해 Facebook 페이지에 게시했지만 페이지 관리자가 로그 아웃하면 다음 오류가 발생합니다.

"(OAuthException-# 190) 액세스 토큰 유효성 검사 오류 : 사용자가 로그 아웃했기 때문에 세션이 유효하지 않습니다."

만료되지 않은 액세스 토큰을 어떻게 생성합니까?

Facebook 로그인 대화 상자를 열지 않는 솔루션이 필요합니다.


다음 지침에 따라 코딩없이 만료되지 않는 액세스 토큰을 생성 할 수 있습니다.

  1. 그래프 탐색기 열기 : https://developers.facebook.com/tools/explorer/ .
  2. 오른쪽 모서리 드롭 다운에서 애플리케이션을 선택합니다.
  3. "Get Token"드롭 다운에서 팬 페이지를 선택합니다.
  4. 제출 버튼을 클릭하여 토큰을 생성하십시오.
  5. "필드 검색"의 왼쪽에서 access_token을 입력하고 제출을 다시 클릭하십시오. 기본 창에서이 토큰을 복사하십시오.
  6. https://developers.facebook.com/tools/debug/accesstoken을 열고 여기에 토큰을 붙여 넣습니다. "디버그"를 클릭합니다.
  7. "Extend Access Token"버튼을 클릭합니다. 만료되지 않는 토큰이 생성됩니다.

다음은 PHP SDK를 사용하여 "Never"만료 액세스 토큰을 생성하는 데 사용하는 코드입니다 .

$facebook = new \Facebook\Facebook([
  'app_id' => '{app-id}',
  'app_secret' => '{app-secret}',
  'default_graph_version' => 'v2.10',
  'default_access_token' => '{access-token}'
]);

// Exchange token
$token = $facebook->post('/oauth/access_token',
    array(  
        'grant_type' => 'fb_exchange_token',           
        'client_id' => 'APP ID',
        'client_secret' => 'APP Secret',
        'fb_exchange_token' => 'access Token'
    )
);
$token = $token->getDecodedBody();
$token = $token['access_token'];

echo $token;

액세스 토큰을 에코 한 다음 액세스 토큰 디버거를 사용하여 디버깅합니다 . 결과는 다음과 같아야합니다 Expires: Never.

문서에서 참조 :


  1. 팬 페이지 http://appdevresources.blogspot.sg/2012/11/extend-facebook-access-token-make-it.html (이미지와 함께 멋진 설명)의 관리자를위한 장기 토큰 생성
  2. 팬 페이지 자체에 대한 장기 토큰 생성 http://appdevresources.blogspot.sg/2012/11/retrieving-facebook-page-id-and.html
  3. 2)의 토큰을 사용하여 팬 페이지의 벽에 게시합니다 (Facebook 로그인 대화 상자 필요 없음).
  4. 결과 토큰은 만료되지 않습니다 (팬 페이지 관리자가 로그 아웃 한 경우에도).

facebook에서 다음 API를 사용하여 토큰 수명을 60 일로 새로 고칠 수 있으며 토큰이 만료 되려고 할 때 60 일 이내에 동일한 API를 다시 호출하여 해당 시점에서 60 일로 수명을 다시 새로 고칠 수 있습니다. 만료 매개 변수에 있으며 값은 초 단위입니다.

CLIENT_ID 및 CLIENT_SECRET을 실제 값으로 바꿉니다.

https://graph.facebook.com/oauth/access_token?client_id=<CLIENT_ID>
&client_secret=<CLIENT_SECRET>&grant_type=fb_exchange_token
&fb_exchange_token=<ACCESS_TOKEN>

ACCESS_TOKEN에 "access_token ="을 추가하지 않고 실제 토큰 값을 입력하십시오.


  1. 없는 경우 앱 만들기 -https : //developers.facebook.com/
  2. 그래프 탐색기 ( https://developers.facebook.com/tools/explorer/) 에서 단기 사용자 액세스 토큰을 만듭니다.

위에서 만든 앱을 선택하고 "드롭 다운에서 사용자 액세스 토큰 가져 오기"를 선택합니다.

사용자 액세스 토큰 팝업에서 토큰에 대한 일부 권한을 선택할 수 있습니다. 만료되지 않은 페이지 액세스 토큰의 경우 "페이지 게시"및 "페이지 관리"를 선택해야합니다.

  1. 수명이 긴 사용자 액세스 토큰 만들기

https://developers.facebook.com/tools/accesstoken/으로 이동합니다 . 거기에서 보유한 모든 앱의 단기 사용자 액세스 토큰과 앱 액세스 토큰을 찾을 수 있습니다.

위에서 만든 앱의 사용자 액세스 토큰의 디버그 옵션을 누릅니다. 디버그 도구로 이동합니다. 단기 사용자 액세스 토큰의 모든 정보를 찾을 수 있습니다.

하단에는이 단기 사용자 액세스 토큰에 대해 수명이 긴 (60 일) 사용자 액세스 토큰을 생성하는 옵션이 있습니다. "Extend Access Token"을 선택하여 수명이 긴 사용자 액세스 토큰을 생성합니다.

  1. 만료되지 않은 페이지 액세스 토큰 만들기

ㅏ. - 그래프 탐색기로 이동 https://developers.facebook.com/tools/explorer/ .

비. 이전 단계에서 생성 된 수명이 긴 사용자 액세스 토큰을 "액세스 토큰"필드에 붙여 넣습니다.

씨. “/ me? fields = access_token”api에 액세스합니다. 그러면 페이지 액세스 토큰과 관련 페이지가 생성됩니다. 이러한 페이지 액세스 토큰은 만료되지 않습니다 (사용자가 암호를 변경 / 사용자가 앱을 취소 할 때까지).

  1. 만료되지 않은 페이지 액세스 토큰 확인

ㅏ. https://developers.facebook.com/tools/debug/accesstoken/으로 이동합니다.

비. 위 단계에서 검색 한 페이지 액세스 토큰을 "액세스 토큰"필드에 추가하고 디버그

Never로 만료됩니다.

약간의 변경 사항이있는 여기에서 찾을 수 있습니다 : https://medium.com/@Jenananthan/how-to-create-non-expiry-facebook-page-token-6505c642d0b1


2018 년 11 월이었고 이것은 나를 위해 일했습니다!

<?php
$args=[
    'usertoken'=>'xxx',
    'appid'=>'xxx',
    'appsecret'=>'xxx',
    'pageid'=>'xxx'
];
function generate_token($args){

$r = json_decode(file_get_contents("https://graph.facebook.com/v2.9/oauth/access_token?grant_type=fb_exchange_token&client_id={$args['appid']}&client_secret={$args['appsecret']}&fb_exchange_token={$args['usertoken']}")); // get long-lived token
    $longtoken=$r->access_token;
    $r=json_decode(file_get_contents("https://graph.facebook.com/{$args['pageid']}?fields=access_token&access_token={$longtoken}")); // get user id
    $finaltoken=$r->access_token;
    return $finaltoken;
}
echo "https://graph.facebook.com/v2.9/oauth/access_token?grant_type=fb_exchange_token&client_id={$args['appid']}&client_secret={$args['appsecret']}&fb_exchange_token={$args['usertoken']}";
echo '<br><br>Permanent access token is: <input type="text" value="'.generate_token($args).'"></input>';

FB 디버그에서 만료되지 않음


받아 들여진 대답은 더 이상 정확하지 않습니다. 이제 작동합니다.

그래프 탐색기 열기 : https://developers.facebook.com

  • 로그인하고 오른쪽 모서리 드롭 다운에서 애플리케이션을 선택합니다.
  • 로그인 한 후 오른쪽 상단의 도구 및 지원 아이콘을 클릭합니다.
  • 그런 다음 애플리케이션 이름 아래 오른쪽에있는 Access Token Tool 링크를 선택합니다.

표시된 사용자 토큰 오른쪽> [디버그] 버튼 클릭

그러면 액세스 토큰 디버거로 이동합니다.

  • Extend Access Token이라고 표시된 하단의 파란색 버튼을 클릭하십시오.
  • 다음과 같이 표시됩니다.이 새로운 장기 액세스 토큰은 만료되지 않습니다.
  • 해당 토큰을 복사하여 애플리케이션에 붙여 넣습니다. EAAYMFDuobYUBADtYjVDukwBGpwPHOCY0iYglYY3j3r200MzyBZB4 .....

manage_pages, pages_show_list 및 기타 범위 권한을 사용하여 FB.login ()에서 사용자 액세스 토큰을 가져와야합니다. 그런 다음 FB.api ( "/ {user-app-id} / accounts", fields : ...)를 실행하여 access_token을 포함한 각각의 정보가있는 페이지 목록을 가져옵니다. 여기에서는 단기 토큰을 얻지 만이 토큰을 사용하면 만료 시간을 "Never"로 연장 할 수 있습니다.

FB.login(function (response){
  if(response.status!=="connected"){
    return;
  }        
  FB.api('/'+USER_APP_ID+'/accounts',{fields: 'id, name, access_token,category, picture'}, 
   function(d){
    console.log(d) // Here you get access_token (short-lived-token)
  });
},{scope: 'manage_pages, pages_show_list', auth_type: 'rerequest'});

마지막 액세스 토큰을 사용하여 서버 측에서 페이지 관리 권한을 얻기 위해 사용하는 앱의 앱 ID 및 앱 시크릿을 사용하여 API Graph를 호출합니다.

GET /oauth/access_token?  
grant_type=fb_exchange_token&           
client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={short-lived-token} 

응답은 만료 시간이 "Never"인 액세스 토큰을 제공합니다.

참조 : API 그래프 계정 , 만료 및 액세스 토큰 확장


4.xFacebook SDK를 사용하는 경우 아래 방법이 저에게 효과적이었습니다 .

  1. Create the Temporary User Access Token for the first time using the method mentioned here.
  2. Now! It's time to convert this token to Long Term Token using PHP SDK 4.x. Use the following code as it worked for me:

//Class for Generating the Long Lived Token

namespace App\Lib;

use Facebook\FacebookApp;
use Facebook\FacebookClient;
use Facebook\Authentication\OAuth2Client;

class FacebookLongLivedTokenGenerator
{
    public $longLivedTokenGenerated = false;

    public function generateFacebookLongLivedToken($appId, $appSecret, $oldToken)
    {
        //request new access token
        $oauth2Fb = new OAuth2Client(new FacebookApp($appId, $appSecret), new FacebookClient());
        $longLivedToken = $oauth2Fb->getLongLivedAccessToken($oldToken);
        if ($longLivedToken) {
            $this->longLivedTokenGenerated = true;
            $this->userAccessToken = $longLivedToken;
        }
        return trim($this->userAccessToken);
    }
}

You can consume the above class this way:

$longToken = new FacebookLongLivedTokenGenerator();
echo $longToken->generateFacebookLongLivedToken($appId, $appSecret, $oldUserAccessToken);

this Makefile works as of 2015-10-29. steps 2 and 3 give only a two-month token, but the page access token given in the final step shows in the debugger as "Expires: Never". this answer draws upon the work of several others, and is provided in the hopes that it will simplify things for developers regardless of preferred programming language.

before using this, you need to put your existing page ID, app ID, and app secret, in that order, in your ~/.netrc file as follows: machine graph.facebook.com login 123456 account 234567 password 345678

also before using this, login to Facebook with w3m, clicking "Keep me logged in".

MACHINE := graph.facebook.com
PAGE_ID := $(shell awk '$$2 ~ /^$(MACHINE)$$/ {print $$4}' $(HOME)/.netrc)
APP_ID := $(shell awk '$$2 ~ /^$(MACHINE)$$/ {print $$6}' $(HOME)/.netrc)
APP_SECRET := $(shell awk '$$2 ~ /^$(MACHINE)$$/ {print $$8}' $(HOME)/.netrc)
PERMISSIONS := manage_pages,publish_actions,publish_pages
FB := https://www.facebook.com
GRAPH := https://$(MACHINE)
CODE ?=
TOKEN ?=
TWOMONTHTOKEN ?=
BROWSER ?= w3m -dump
REDIRECT := http://jc.unternet.net/test.cgi
CLIENT_SIDE := $(FB)/dialog/oauth?client_id=$(APP_ID)&redirect_uri=$(REDIRECT)
CLIENT_SIDE := $(CLIENT_SIDE)&scope=$(PERMISSIONS)&response_type=code
SERVER_SIDE := $(GRAPH)/oauth/access_token?client_id=$(APP_ID)
SERVER_SIDE := $(SERVER_SIDE)&redirect_uri=$(REDIRECT)
SERVER_SIDE := $(SERVER_SIDE)&client_secret=$(APP_SECRET)&code=$(CODE)
LONG_LIVED := $(GRAPH)/oauth/access_token?client_id=$(APP_ID)
LONG_LIVED := $(LONG_LIVED)&client_secret=$(APP_SECRET)
LONG_LIVED := $(LONG_LIVED)&grant_type=fb_exchange_token
LONG_LIVED := $(LONG_LIVED)&fb_exchange_token=$(TOKEN)
ACCOUNTS := $(GRAPH)/me/accounts?access_token=$(TWOMONTHTOKEN)
export
env:
    env
    @echo Usage: make code
    @echo '        ' make CODE=codefrompreviousstep token
    @echo '        ' make TOKEN=tokenfrompreviousstep longterm
    @echo '        ' make TWOMONTHTOKEN=tokenfrompreviousstep accounts
    @echo Then edit '$$HOME/.netrc' replacing password with page token
code:
    $(BROWSER) "$(CLIENT_SIDE)"
token:
    $(BROWSER) "$(SERVER_SIDE)"
longterm:
    $(BROWSER) "$(LONG_LIVED)"
accounts:
    $(BROWSER) $(ACCOUNTS)

it turns out in many cases the first step fails with w3m. in that case, install another browser such as firefox; ssh -X to your server if the script is remotely hosted; and use make BROWSER=firefox code instead. the following steps should work with w3m as shown.

note: if cutting-and-pasting this Makefile, make sure to replace the 4-space indentations with proper tabs.


Using Facebook API v3.1 - None of the answers above worked for me. Instead, I had to:

1) Create a "system user"

2) Grant him access to the properties I needed (in my case an App)

3) Generate a new token for that app and system user

The instructions I used can be found here

참조 URL : https://stackoverflow.com/questions/17426018/generate-never-expire-access-token-for-facebook-page

반응형