【问题标题】:Unable to get a long term access token using facebook graph api无法使用 facebook graph api 获取长期访问令牌
【发布时间】:2013-09-06 01:50:56
【问题描述】:

我不熟悉将 facebook 集成到我正在开发的网站中,并尝试按照此处的说明获取长期访问令牌:https://developers.facebook.com/docs/facebook-login/access-tokens/ 即使在此处使用 Graph API Explorer:https://developers.facebook.com/tools/explorer/ 我输入以下内容并使用我的 AppID 和 AppSecret 以及按获取访问令牌时获得的当前令牌填充它...

GET /oauth/access_token?
grant_type=fb_exchange_token&
client_id={app-id}& client_secret={app-secret}& fb_exchange_token={短期令牌}

我得到回报

{ "error": "无效响应" }

有人可以详细说明我可能做错了什么,或者更详细的步骤对您获得这个长期令牌有用。

我已尝试关注此线程 Facebook Page Access Tokens - Do these expire? 中发生的事情,但没有成功。任何帮助将不胜感激。

感谢您的时间和帮助。 干杯,

-瑞恩

【问题讨论】:

  • 您在寻找长期的user access tokenpage access token

标签: facebook facebook-graph-api facebook-access-token


【解决方案1】:

您无法使用Graph API Explorer 获取long-lived user token。您必须发出GET 请求:

https://graph.facebook.com/oauth/access_token?
grant_type=fb_exchange_token&
client_id={app-id}& client_secret={app-secret}& fb_exchange_token={short-lived-token}

您可以在浏览器中查看。

如果您需要page access token,您可以拥有一个永不过期的令牌。在此处查看接受的答案:What are the Steps to getting a Long Lasting Token For Posting To a Facebook Fan Page from a Server

【讨论】:

  • 非常感谢!这确实与我所做的并没有什么不同,但出于某种原因,将请求直接放入 url 栏让这对我有用。页令牌是下一步,感谢额外的链接!
  • 当我从浏览器调用它时它会给我一个响应,但是当我使用 php 代码调用它时它给我一个这样的错误:Error validating access token: Session has expired on Friday, 17-Mar-17 04:38:48 PDT. The current time is Saturday, 10-Jun-17 00:44:35 PDT.,任何解决方案。我想获取新令牌,因为旧令牌已过期。
  • 您可以从简单的Login 流程中获取short-lived user access token
【解决方案2】:

所以我想我会重新审视这个并提供我编写的文档,希望能帮助其他人实现这一目标!

一个。创建应用程序

创建一个与您想要访问的页面的用户相关联的应用程序。

两个。获取所需的信息

创建应用后,我们应该有两个关键信息:

应用 ID:AAAAA(应该大约 15 个字符长)

App Secret:BBBBB(应该大约 32 个字符长)

通过这些转到https://developers.facebook.com/tools/explorer 确保从顶部的下拉框中选择正确的应用程序。

点击获取访问令牌并获取“新”令牌。

在这里,您需要为特定应用的用途选择适当的权限。

CCCCC(应该是 ~200 个字符)

三个。获得长寿令牌(2 个月)

然后,您应该拥有运行查询所需的信息,以获得长期(2 个月)令牌:

https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id={app-id}& client_secret={app-secret}& fb_exchange_token={short-lived-token}

将 {app-id}、{app-secret} 和 {short-lived-token} 替换为您目前注意到的三个信息。

您应该收到如下请求:

https://graph.facebook.com/oauth/access_token?%20grant_type=fb_exchange_token&%20client_id=AAAAA&%20client_secret=BBBBB&%20fb_exchange_token=CCCCC

将此查询放入互联网浏览器的网址栏中。您应该会在类似于以下内容的窗口中得到响应:

access_token=DDDDD&expires=5184000

DDDDD(大约 200 个字符长)

四个。测试令牌(第 1 部分)

如果您在以下调试站点的输入中输入突出显示的部分:

https://developers.facebook.com/tools/debug/

它应该给你大约 2 个月的有效期。

五个。获取非过期页面令牌

现在请注意这个新的长寿命令牌,我们将使用它来获取不会过期的令牌,除非关联的应用程序从用户的访问权限中删除或删除。 我们在发出请求时使用页面名称或最好使用页面 ID:

您可以使用http://findmyfacebookid.com/ 之类的方式获取您的 Facebook 页面 ID 我们会将您的页面 ID 称为 EEEEE

https://graph.facebook.com/{page-id}/?fields=access_token&access_token={long-live-token}

您应该收到如下请求:

https://graph.facebook.com/EEEEE/?fields=access_token&access_token=DDDDD

这将返回如下内容: { “access_token”:“FFFFF”, “id”:“131062838468” }

FFFFF(应该是 ~200 个字符)

。测试令牌(第 2 部分)

将突出显示的部分输入调试页面,您应该会看到显示令牌永不过期的内容,并且您已成功获取永不过期的页面令牌。

。举手击掌!

对于如何实现这一点的一长串列表感到抱歉,但我发现给出整个过程而不是一个小的 sn-p 会更好。如果您觉得这对您有帮助,或者您有更好的方法来完成任何步骤,请告诉我。

【讨论】:

  • 嗨@Ryan,这不起作用。创建的应用程序会在 facebook 上发帖,但只有页面管理员可以看到它的帖子。
【解决方案3】:

Facebook PHP SDK已经实现了使用short-lived token获取long-lived token的方法,登录成功并获得short-lived token后,调用简单

$result = $facebook->setExtendedAccessToken();

如果 $result 为 null,则表示您获得了长期访问令牌。

【讨论】:

    【解决方案4】:

    客户端

            if (response.status === 'connected') {
                {
                    event.preventDefault();
                    FB.login(function (response) {
                        if (response.authResponse) {
                            var profileId = response.authResponse.userID;
                            var accessToken = response.authResponse.accessToken;
                            var e = response.authResponse.accessToken;
                            document.getElementById('token').innerHTML = e;
                            var profileName = "";
                            var pagesList = "";
                            var isPage = 0;
                            var type = "fb";
                            $.ajax({
                                url: "WebService1.asmx/getlonToken",
                                type: "POST",
                                dataType: 'json',
                                data: '{accessToken:"' + accessToken + '"}',
                                contentType: "application/json; charset=utf-8",
                                async: true,
                                success: function (response) {
                                    accessToken = response.d;
                                    document.getElementById('status').innerHTML = accessToken;
                                },
                                error: function (e) {
                                    alert('Error' + e);
                                }
                            });
    
    
    
                        }
                    }, { scope: 'user_about_me,friends_about_me,user_activities,friends_activities,user_birthday,friends_birthday,user_education_history,friends_education_history,user_events,friends_events,user_groups,friends_groups,user_hometown,friends_hometown,user_interests,friends_interests,user_likes,friends_likes,user_location,friends_location,user_notes,friends_notes,user_photos,friends_photos,user_relationships,friends_relationships,user_relationship_details,friends_relationship_details,user_status,friends_status,user_videos,friends_videos,user_website,friends_website,email,manage_pages,publish_stream,read_stream,read_page_mailboxes,read_insights, read_mailbox' });
    
                }
    

    服务器端

       [WebMethod]
        public string getlonToken(string accessToken)
        {
            var fb = new FacebookClient(accessToken);
            dynamic result = fb.Get("oauth/access_token", new
                {
                    client_id = 123,
                    client_secret = "123fff45",
                    grant_type = "fb_exchange_token",
                    fb_exchange_token = accessToken,
                    scope = "user_about_me,friends_about_me,user_activities,friends_activities,user_birthday,friends_birthday,user_checkins,friends_checkins,user_education_history,friends_education_history,user_events,friends_events,user_groups,friends_groups,user_hometown,friends_hometown,user_interests,friends_interests,user_likes,friends_likes,user_location,friends_location,user_notes,friends_notes,user_photos,friends_photos,user_relationships,friends_relationships,user_relationship_details,friends_relationship_details,user_religion_politics,friends_religion_politics,user_status,friends_status,user_videos,friends_videos,user_website,friends_website,email,manage_pages,publish_stream,read_stream,read_page_mailboxes,read_insights,ads_management"
                });
    
            fb.AccessToken = (string)result["access_token"];
            return fb.AccessToken;
        }
    }
    

    【讨论】:

    • 必须创建一个名为 WebService1.asmx 的 Web 服务,然后将服务器端代码放在此文件中
    【解决方案5】:

    您可以从Graph API Explorer 生成 Short-Lived Token。

    然后你可以在Access Token Debugger 的 Long-Lived Token 中扩展它。 我每次都这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      相关资源
      最近更新 更多