为Facebook页面生成“永不过期”的访问令牌

时间:2013-07-02 12:45:53

标签: facebook

我已设法通过API(C#)发布到Facebook页面,但当页面管理员注销时,会出现以下错误:

“(OAuthException - #190)验证访问令牌时出错:会话无效,因为用户已注销。”

如何生成永不过期的访问令牌?

我需要一个无法打开Facebook登录对话框的解决方案。

12 个答案:

答案 0 :(得分:29)

您可以按照以下说明生成永不过期的访问令牌而无需编码:

  1. 打开图表资源管理器:https://developers.facebook.com/tools/explorer/
  2. 从右上角的下拉菜单中选择您的应用程序。
  3. 从“获取令牌”下拉列表中选择您的粉丝专页。
  4. 点击提交按钮以生成令牌。
  5. 从“搜索字段”左侧输入access_token,然后再次单击“提交”。从主窗口复制此令牌。
  6. 打开https://developers.facebook.com/tools/debug/accesstoken并在此处粘贴令牌。单击“调试”。
  7. 单击“扩展访问令牌”按钮。这将生成永不过期的令牌。

答案 1 :(得分:23)

这是我用来生成" Never"的代码。使用PHP SDK来过期访问令牌:

$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;

我回显访问令牌,然后使用access token debugger对其进行调试。结果应为:Expires: Never

文档中的参考文献:

答案 2 :(得分:11)

  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. 生成长期令牌
  4. 使用2中的令牌发布在粉丝页面的墙上(不需要Facebook登录对话框)
  5. 结果令牌将永不过期(即使粉丝页面的管理员已注销)

答案 3 :(得分:4)

你可以使用facebook下面的api将令牌生命刷新到60天,当令牌即将到期时,再用60天的时间再次调用相同的api,将其生命从那个时间点恢复到60天 令牌过期出现在expires参数中,其值以秒为单位

将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 =”

答案 4 :(得分:3)

  1. 如果您没有 - https://developers.facebook.com/
  2. ,请创建一个应用
  3. 在图形浏览器中创建一个短暂的用户访问令牌 - https://developers.facebook.com/tools/explorer/
  4. 选择上面创建的应用,然后选择“在下拉列表中获取用户访问令牌”

    在弹出的用户访问令牌中,您可以为令牌选择一些权限。 对于非过期页面访问令牌,您需要选择&#34;发布页面&#34;和&#34;管理页面&#34;

    1. 创建长期存在的用户访问令牌
    2. 转到https://developers.facebook.com/tools/accesstoken/。在那里,您将找到所有应用程序的短期用户访问权限和应用程序访问令牌

      按上面创建的应用的用户访问令牌的调试选项。这将带您进入调试工具。在哪里可以找到短期用户访问令牌的所有信息。

      在底部,可以选择为此短期用户访问令牌生成长期(60天)用户访问令牌。通过选择“扩展访问令牌”

      生成长期存在的用户访问令牌
      1. 创建永不过期的页面访问令牌
      2. 一个。转到图形资源管理器 - https://developers.facebook.com/tools/explorer/

        湾将上一步中生成的长期用户访问令牌粘贴到“访问令牌”字段中。

        ℃。访问“/ me?fields = access_token”api。这将导致页面访问令牌和与其相关的页面。这些页面访问令牌永远不会过期(直到用户更改密码/用户撤销应用程序)

        1. 验证非过期页面访问令牌
        2. 一个。转到https://developers.facebook.com/tools/debug/accesstoken/

          湾将从上面步骤检索到的页面访问令牌添加到“访问令牌”字段并调试

          您将以“从不

          ”到期

          发现这里几乎没有变化: https://medium.com/@Jenananthan/how-to-create-non-expiry-facebook-page-token-6505c642d0b1

答案 5 :(得分:2)

接受的答案不再正确。这现在有效。

打开图表资源管理器:https://developers.facebook.com

  • 登录并从右上角的下拉列表中选择您的应用
  • 登录后,点击工具&amp;右上角的支持图标
  • 然后选择应用程序名称下方右侧的“访问令牌工具”链接

显示的用户令牌右侧&gt;单击[调试]按钮

这将带您进入访问令牌调试器

  • 点击底部显示“扩展访问令牌”
  • 的蓝色按钮
  • 这将说明:这个新的长期访问令牌将永不过期
  • 将该令牌复制并粘贴到您的应用程序中; EAAYMFDuobYUBADtYjVDukwBGpwPHOCY0iYglYY3j3r200MzyBZB4 .....

答案 6 :(得分:2)

您需要通过FB.login()获取用户访问令牌,其中包含manage_pages,pages_show_list和其他范围权限。然后,执行FB.api(“/ {user-app-id} / accounts”,fields:...)以获取包含其各自信息的页面列表,包括access_token。在这里,您获得了一个短期令牌,但使用此令牌,您可以将其到期时间延长至“从不”。

In [54]: X_train = X_train[labels2 != -1]

In [55]: X_train
Out[55]: 
array([[ 1,  2,  3],
       [ 7,  8,  9],
       [10, 11, 12]])

使用最后一个访问令牌,从服务器端,使用您用来获取管理页面权限的App的App ID和App Secret调用API Graph。

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'});

响应为您提供了一个访问令牌,其过期时间为“从不”。

参考文献: API Graph AccountsExpiration and Extends Access Tokens

答案 7 :(得分:2)

那是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>';

Never Expire from FB Debug

答案 8 :(得分:1)

如果您使用4.x Facebook SDK:

,下面的方法对我有用
  1. 首次使用提到的here
  2. 方法创建临时用户访问令牌
  3. 现在,!是时候使用PHP SDK 4.x将此令牌转换为长期令牌。使用以下代码对我有用:
  4. //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);
        }
    }
    

    您可以这样使用上述类:

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

答案 9 :(得分:0)

此Makefile的工作时间为2015-10-29。步骤2和3仅提供两个月的令牌,但最后一步中给出的页面访问令牌在debugger中显示为“Expires:Never”。这个答案借鉴了其他几个人的工作,希望它能够为开发人员简化一些事情,无论其首选的编程语言如何。

在使用此功能之前,您需要按照以下顺序将现有页面ID,应用程序ID和应用程序密码放在〜/ .netrc文件中,如下所示:machine graph.facebook.com login 123456 account 234567 password 345678

在使用此功能之前,请使用w3m登录Facebook,点击“保持登录状态”。

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)

事实证明,在许多情况下,第一步失败了w3m。在这种情况下,安装另一个浏览器,如Firefox;如果脚本是远程托管的,则ssh -X到您的服务器;并改用make BROWSER=firefox code。以下步骤应与w3m一起使用,如图所示。

注意:如果剪切并粘贴此Makefile,请确保用适当的标签替换4空格缩进。

答案 10 :(得分:0)

使用Facebook API v3.1-上面的答案都不适合我。 相反,我必须:

1)创建一个“系统用户”

2)授予他访问所需属性的权限(在我的情况下为App)

3)为该应用和系统用户生成一个新令牌

我使用的说明here

答案 11 :(得分:-1)

podrias intentar algo como esto

Administrar Paginas
<a href="#" class="btn" onclick="token_live()" >url</a>

                            <script type="text/javascript">
                                function token_live(){
                                    var token_app = "";
                                    $.ajax({
                                        url: "https://graph.facebook.com/v2.8/oauth/access_token?grant_type=fb_exchange_token&client_id=598062314053459&client_secret='client_secret'&fb_exchange_token=access_token",
                                        type: 'POST',
                                        dataType: 'HTML',
                                        data: {api_public: 'AP-42b3a8aab70',
                                        },
                                    })
                                    .done(function(data) {

            var txt = data
var obj = JSON.parse(txt);

    var token_live = obj.access_token

var url_infinit = "https://graph.facebook.com/v2.8/oauth/access_token?grant_type=fb_exchange_token&client_id='remplaza_cliente_id'&client_secret='client_secret'&fb_exchange_token="+token_live;

alert(url_infinit);

```