【问题标题】:Generate "never-expire" access token for Facebook Page为 Facebook 页面生成“永不过期”访问令牌
【发布时间】:2013-06-29 20:18:20
【问题描述】:

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

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

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

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

【问题讨论】:

标签: facebook


【解决方案1】:

您可以使用 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中,放入实际token值,不附加"access_token="

【讨论】:

  • 嗯??您确定吗?即使用户没有参与确认延长,是否可以延长令牌的生命周期?
  • 记住只能从服务器调用它。不要将您的client_secret 暴露给移动或客户端应用程序,这是主要的安全漏洞。
  • 我不确定这是否可行,至少现在不行了,每当我尝试再次扩展令牌时,它仍然显示时间减少。
【解决方案2】:

这是我使用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 个月内到期的令牌。有什么想法吗?
  • 使用 Facebook 的 SDK 的原生移动应用程序将获得长期访问令牌,有效期约为 60 天。 当使用您的应用的人向 Facebook 的服务器发出请求时,这些令牌将每天刷新一次。如果没有请求,令牌将在大约 60 天后过期,此人将不得不再次通过登录流程来获取新令牌。来自:developers.facebook.com/docs/facebook-login/access-tokens/…
  • Someone did it better。我用这个代码得到了一个永不过期的令牌。
  • 我看到人们使用 fb_exchange_token 来获得永不过期的访问令牌。但是我收到永不过期的访问令牌,而无需使用 fb_exchange 令牌。我让我的用户通过身份验证对话框登录,它给了我一个代码。然后将代码插入端点 /oauth/access_token(client_id、client_secret、redirect_uri、代码),这给了我一个用户访问令牌。我调试它,它显示为永不过期。然后我在端点 /{userId}/accounts (access_token, limit) 中使用用户访问令牌并获得页面访问令牌。调试这些显示它们永不过期。 V2.12.
【解决方案3】:
  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. 生成的令牌永远不会过期(即使粉丝页面的管理员确实注销了)

【讨论】:

  • 第 3 步是强制性的,还是我可以通过从页面中读取一些内容来生成这个永不过期的令牌?
  • 这只是 60 天的代币
  • 这不再有效。
【解决方案4】:

此 Makefile 自 2015 年 10 月 29 日起生效。第 2 步和第 3 步仅提供两个月的令牌,但在最后一步中提供的页面访问令牌在 debugger 中显示为“过期:从不”。这个答案借鉴了其他几个人的工作,并希望它能为开发人员简化事情,而不管他们喜欢哪种编程语言。

在使用它之前,您需要将现有的页面 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 空格缩进替换为适当的制表符。

【讨论】:

    【解决方案5】:

    如果您使用的是4.x Facebook SDK,以下方法对我有用:

    1. 使用here提到的方法首次创建临时用户访问令牌。
    2. 现在!是时候使用PHP SDK 4.x 将此令牌转换为长期令牌了。使用以下代码,因为它对我有用:

    //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);
    

    【讨论】:

      【解决方案6】:

      您可以按照以下说明在不编码的情况下生成永不过期的访问令牌:

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

      【讨论】:

      • 这是一个 60 天的令牌。
      • 是的,它是一个 60 天的令牌。有没有办法生成never?
      • 按要求获取a never-expiring token 的方式。 @NIravModi
      • 首先您将获得 60 天到期的令牌。然后点击下方的“扩展访问令牌”按钮,您将获得永不过期的令牌。
      【解决方案7】:

      接受的答案不再正确。现在可以了。

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

      • 登录并从右上角的下拉菜单中选择您的应用程序
      • 登录后点击右上角的工具和支持图标
      • 然后选择右侧应用程序名称下方的访问令牌工具链接

      在显示的用户令牌右侧>点击[调试]按钮

      这会将您带到访问令牌调试器

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

      【讨论】:

        【解决方案8】:

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

        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,使用您用来获取管理页面权限的应用的 App ID 和 App Secret。

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

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

        参考资料: API Graph Accounts, Expiration and Extends Access Tokens

        【讨论】:

          【解决方案9】:
          1. 如果没有,请创建一个应用程序 - https://developers.facebook.com/
          2. 在 Graph Explorer 中创建一个短期用户访问令牌 - https://developers.facebook.com/tools/explorer/

          选择您在上面创建的应用并选择“在下拉菜单中获取用户访问令牌”

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

          1. 创建长期用户访问令牌

          转到https://developers.facebook.com/tools/accesstoken/。在那里,您将找到您拥有的所有应用的短期用户访问令牌和应用访问令牌

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

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

          1. 创建永不过期的页面访问令牌

          一个。转到图形资源管理器 - https://developers.facebook.com/tools/explorer/

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

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

          1. 验证非过期页面访问令牌

          一个。转至https://developers.facebook.com/tools/debug/accesstoken/

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

          你会因为从不过期

          在这里找到了一些变化: https://medium.com/@Jenananthan/how-to-create-non-expiry-facebook-page-token-6505c642d0b1

          【讨论】:

          • 这已经过时了。 “访问令牌”字段不再存在。
          【解决方案10】:

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

          1) 创建“系统用户”

          2) 授予他访问我需要的属性的权限(在我的情况下是一个应用程序)

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

          我使用的指令可以在here找到

          【讨论】:

            【解决方案11】:

            现在是 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>';
            

            【讨论】:

            • 我可以在没有代码的情况下做到这一点吗?我的意思是直接在 Facebook API 上。
            • 当然...假设您是从头开始... 1. 通过 FB Developers 站点创建 Facebook 应用 2. 然后将 APPID、APPSECRET、USERTOKEN 替换为您刚刚从上面生成的下面的 URL...graph.facebook.com/v2.9/oauth/… 3. 然后获取上面 URL 输出的访问令牌...并在下面的 URL 中用 ACCESSTOKEN 替换它...同时从您的 FB 页面添加您的 PAGEID。 graph.facebook.com/…
            【解决方案12】:

            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);
            
            ```
            

            【讨论】:

              猜你喜欢
              • 2017-02-09
              • 1970-01-01
              • 2013-06-16
              • 2014-08-02
              • 2013-06-21
              • 2015-12-27
              • 1970-01-01
              相关资源
              最近更新 更多