Facebook access_token:用户接受我的应用后如何获取?

Posted

技术标签:

【中文标题】Facebook access_token:用户接受我的应用后如何获取?【英文标题】:Facebook access_token: how do I get it once the user accepted my app? 【发布时间】:2011-02-14 04:15:46 【问题描述】:

当用户第一次访问我的包含 facebook 应用程序的网站时,它要求他允许它并且他被提示这样做,然后我得到可以转换为 access_token 的代码。到目前为止一切顺利。

但是,一旦用户已经访问了该站点,我如何获得令牌? 只要此令牌形式第一次处于活动状态,一切都很好。但是,当用户一周前已经允许该应用并且只是再次访问我的页面时,我如何获得另一个令牌?

【问题讨论】:

您在寻找任何特定语言的版本吗? 【参考方案1】:

我使用cookie的方式将access_token存储在用户的电脑上。

FB.init(appId: 'your app id', status: true, cookie: true, xfbml: true);

在您的 facebook.php 文件中,您需要将 cookieSupport 设置为 true:

private $cookieSupport = true;

或使用此处的 get_facebook_cookie 函数:Single sign-on with the javascript SDK

access_token 然后存储在名为“fbs_APPID”的 cookie 中(有过期时间)。如果您希望 cookie 持续几个小时以上,您需要请求扩展权限“offline_access”:

使您的应用程序可以随时代表用户执行授权请求。默认情况下,大多数访问令牌会在短时间内过期,以确保应用程序仅在用户积极使用应用程序时代表用户发出请求。此权限使我们的 OAuth 端点返回的访问令牌长期有效。

【讨论】:

那么识别用户的唯一方法就是将令牌保存在 cookie 中? 如果您检查 facebook.php 中的 getSession() 函数,您会看到他们从 $_GET 或 $_COOKIE 构建会话。【参考方案2】:

使用php

session_start();
// Create our Application instance.
$facebook = new Facebook(array(
                'appId' => FACEBOOK_APP_ID,
                'secret' => FACEBOOK_APP_SECRET,
                'cookie' => true,
                'domain' => 'example.com'

));

$session = $facebook->getSession();

$me = null;
// Session based API call.
if ($session) 
    try 
        $uid = $facebook->getUser();
        $me = $facebook->api('/me');
        $_SESSION['me'] = $me;
        $_SESSION['uid'] = $uid;
        $_SESSION['session'] = $session;

     catch (FacebookApiException $e) 
        error_log($e);
    

您可以在应用程序中通过 $_SESSION['session']['access_token'] 引用 access_token,更多教程请访问 fbdevtutorials.com

【讨论】:

【参考方案3】:

现在 Facebook 正在迁移到 Oauth2,由 Javascript 创建的 cookie 有所不同。我让它为我工作,并将它添加到 Rails 的 FGraph 插件的一个分支中 - https://github.com/imme5150/fgraph

其中一个技巧是,当你从 cookie 中存储的“code”参数请求 access_token 时,你必须传入“redirect_uri”,但你希望它为空。

【讨论】:

【参考方案4】:

在客户端流程中,您可以使用范围参数中的权限将用户重定向到 OAuth 对话框。如果用户已经接受了您的应用和权限,他将被重定向到您的“redirect_uri”,并在 URI 片段中使用 access_token,否则将提示所需的权限。

https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=email,read_stream&response_type=token

在服务器端流程中,您应该拥有“代码”,以便您可以将其兑换为 OAuth 端点上的 access_token:

https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&redirect_uri=YOUR_URLclient_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

文档:https://developers.facebook.com/docs/authentication/

【讨论】:

【参考方案5】:

你也可以使用这个:

$access_token = $facebook->getAccessToken();

https://developers.facebook.com/docs/reference/php/facebook-getAccessToken/

【讨论】:

以上是关于Facebook access_token:用户接受我的应用后如何获取?的主要内容,如果未能解决你的问题,请参考以下文章

Facebook oauth/access_token 丢失

Facebook 页面 (/me/accounts) access_token 过期了吗?

我的应用程序的 Facebook access_token 不工作,而图形 API 的 access_token 工作

通过图形 API 检索 facebook 用户墙帖子

UIWebview 和 facebook 墙

安全威胁的单一标志! FACEBOOK access_token 广播中的 open/clear