我们假设有一个网站想要在Facebook上以用户名发布。首先,当用户链接到Facebook时,他将拥有访问令牌和读取权限,以便他可以使用Facebook登录该网站。在给定事件中,用户将使用访问令牌在Facebook上具有写入权限。
过了一段时间,Facebook访问令牌到期(看起来似乎,但如果有办法创建永远不会过期的Facebook访问令牌,我会很高兴听到),所以在网站上每当有一个帖子到Facebook即将发布,必须向Facebook发送请求以检查访问令牌的有效性。如果访问令牌无效,则需要重定向到Facebook,其中生成新的访问令牌,然后Facebook重定向回页面。
我认为没有永久的Facebook访问令牌。如果有永久的Facebook访问权限,那么如何创建它们呢?
如果Facebook访问令牌过期,除了重定向到Facebook以生成访问令牌并重定向回来之外,还有其他问题吗?
编辑: 在这里:https://developers.facebook.com/docs/opengraph/howtos/publishing-with-app-token/ 我已经阅读了标题为“使用App Access Token发布API调用”的部分。
它声明我需要用户的FacebookID和用户授予的publish_action权限才能在Facebook上发布他们的名字。但是,我很困惑我可以获得用户的FacebookID以及用户如何授予网站publish_action权限。此外,本节还提到了这一点 “您将无法使用应用访问令牌检索有关具有给定ID的状态更新帖子的信息。相反,您应该使用用户访问令牌来实现此目的。” 我真的不明白用这种可能性检索哪些信息是不可能的。与具有访问令牌的策略相比,我并不真正理解这种策略的劣势原因。
答案 0 :(得分:2)
简短的回答是肯定的,您必须重定向到Facebook(或使用Javascript SDK)才能让FB为您提供新的访问令牌。如果用户已登录Facebook并且尚未删除您的应用程序,则该过程对您的用户来说几乎是不可见的。
但是,您可以将允许使用访问令牌的时间从1-2小时延长到更长的时间(我无法找到时间参考,但我似乎记住这是一个3-6个月的时间)。您可以在Access Tokens Documentation。
中了解该流程首先,您必须了解App访问令牌和用户访问令牌之间的区别。应用访问令牌是一个非常简单的令牌,Facebook用它来验证您的应用是否正在发出您打算发出的请求。您的应用访问令牌包含您的应用ID和您的app secret作为字符串,并以|
字符分隔。此令牌不授予您访问任何用户信息的权限,并且不能用于很多事情(它主要用于身份验证方法,以确保在您请求令牌时,请求来自你,而不是一些伪装成你的第三方)。虽然,就像你上面发现的那样 - 你也可以用它来发帖给用户的提要,只要他们给你提供访问权。
用户访问令牌可识别应用程序的实际用户及其会话。用户访问令牌通常持续几个小时然后到期。您可以将此令牌换成扩展访问令牌,如上所述,我相信可以持续使用几个月。
用户令牌(时间1-2小时版本或扩展版本)允许您以用户所属的用户身份访问FB图形API。因此,使用这些令牌,您可以访问用户的朋友列表,照片,喜欢,兴趣等(假设您在应用程序安装时请求了许可)。您可以使用用户访问令牌检查您拥有的权限,并在图表API上向/me/permissions
发出请求。
Javascript SDK是独一无二的,因为它不要求您将用户从应用程序中重定向。 JS SDK允许您使用弹出窗口允许用户通过Facebook进行身份验证,安装您的应用程序,或允许(或拒绝)您请求的权限。
FB.login
方法需要2个参数。参数1是在用户响应您的身份验证提示后(通过接受或拒绝您的应用程序安装请求)执行的回调。参数2用于作为javascript对象传递的选项,您在此处唯一关注的是scope
参数。 scope
参数是您要求扩展权限的方式(例如publish_action
),因此为了从用户获取发布流权限,您使用的代码看起来像这样
<script type="text/javascript">
FB.login(function(response)
{
//check to see if they accepted or rejected, and do something
}, { scope: "publish_action });
</script>
一旦用户接受,对FB JS SDK的任何后续调用都将自动包含您用户的访问令牌,您不必自己管理它。您可以代表用户调用图表API,而无需明确指定用户的用户ID - 您只需将其引用为me
即可。因此,例如,您可以通过JS SDK发布到用户的Feed,如下所示:
<script type="text/javascript">
FB.api('/me/feed', 'post', { message: 'test!' }, function(response)
{
//do things
});
</script>
但是,如果您希望代表用户从您的服务器调用Graph API以发布到他们的Feed(或者您需要这样做),那么您必须存储用户的FB用户ID以及您的用户数据,以便您以后访问它。该用户ID在传递给FB.login
回调(response.authResponse.userID
)的参数中可用。存储后,只需POST
/<user_id>/feed
使用适当的数据,您就可以代表用户从服务器进行图谱API调用:
$ curl -d "message=test&access_token=<app_access_token>" /<user_id>/feed
最后,重新验证您的用户。 FB JS SDK公开了3种身份验证方法。
FB.getAuthResponse
和FB.getLoginStatus
之间的主要区别在于getAuthResponse
在调用任何进一步的javascript(它的阻止或同步)之前等待来自Facebook的响应。 FB.getLoginStatus
将允许其他javascript运行,并在收到响应时调用您提供的回调,允许您在等待响应时执行其他操作。这些方法中的任何一种都可用于确定您的用户当前是否已登录到Facebook以及用户是否已安装您的应用程序。然后,您可以使用FB.login
(如果他们未登录到FB,或者不是您应用的用户)提示他们登录或安装,以便您可以访问他们的信息。如果这些方法已经安装并且已经授权您的应用(response.authResponse.accessToken
),则这两种方法都会将用户的访问令牌传回给您。
FB.login
检查用户的登录状态,但总是会弹出登录/安装对话框,无论状态如何(如果他们已登录/安装,它将会立即隐藏弹出窗口)。如果您需要向用户请求其他权限,也会使用FB.login
方法(假设您首先获得&#34; vanilla&#34;安装,之后用户说他们希望您发布到他们的Feed。当他们启动该选项时,您可以请求他们的扩展许可)。为了利用该功能,您可以像使用FB.login
一样使用scope
,除非您在options
FB.getAuthResponse
属性中添加了您想要/需要的扩展权限。你传递的变量作为第二个参数。
使用FB.getLoginStatus
或FB.login
确定您的用户是否已登录并安装了您的应用程序。当您的用户使用您的应用程序时,这些方法也可用于获取新的访问令牌。
使用publish_action
让新的/未经身份验证的用户安装您的应用程序。
用户登录后,获取用户ID并将其存储在某个地方。一旦您获得用户的{{1}}权限,这可以用来代表他们发布您的应用访问令牌
如果要存储长期存在的用户访问令牌以访问用户的配置文件和其他信息,请稍后使用上面的链接来交换用户访问令牌以获取扩展访问令牌。这是一个服务器端进程,您可以使用用户的其他凭据将生成的访问令牌存储在数据库中。
对不起这么久而且罗嗦 - 我只是想向您提供有关访问令牌,它们如何使用以及如何使用JS SDK来维护它们的一些可靠信息。希望这会有所帮助。