1

假设有一个网站想以用户的名义在 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/ 我已阅读标题为“使用应用程序访问令牌进行 API 调用以发布”的部分。

它声明我需要用户的 FacebookID 和用户授予的 publish_action 权限才能以他们的名义在 Facebook 上发帖。但是,我对获取用户的 FacebookID 以及用户如何授予网站 publish_action 权限的方式感到困惑。此外,本节提到“您将无法使用应用访问令牌检索具有给定 ID 的状态更新帖子的信息。相反,您应该为此目的使用用户访问令牌。” 我真的不明白这种可能性不可能检索到哪些信息。与使用访问令牌的策略相比,我并不真正理解这种策略劣势的原因。

4

1 回答 1

2

简短的回答是肯定的,您必须重定向到 Facebook(或使用 Javascript SDK)才能让 FB 为您提供新的访问令牌。如果用户已经登录到 Facebook 并且没有删除您的应用程序,那么您的用户将几乎看不到该过程。

但是,您可以将允许使用访问令牌的时间从 1-2 小时延长到更长的时间(我找不到时间参考,但我似乎记得它是 3-6月期间)。您可以在访问令牌文档中了解该过程。

编辑

首先,您必须了解 App 访问令牌和用户访问令牌之间的区别。应用程序访问令牌是一个非常简单的令牌,facebook 使用它来验证您的应用程序正在发出您希望它发出的请求。您的应用程序访问令牌由您的应用程序 ID 和您的应用程序密码组成,作为字符串并由一个|字符分隔。此令牌不会授予您访问任何用户信息的权限,并且不能真正用于很多事情(它基本上用于身份验证方法,以确保当您请求令牌时,请求来自您而不是一些伪装成你的第 3 方)。不过,就像您在上面发现的那样 - 您也可以使用它向用户的提要发布帖子,前提是他们允许您访问。

用户访问令牌可识别您的应用程序的实际用户及其会话。用户访问令牌通常会持续几个小时然后过期。你可以用这个令牌交换一个扩展的访问令牌,正如我上面所说的,我相信它可以持续几个月。

用户令牌(临时 1-2 小时版本或扩展版本)允许您以用户所属的用户身份访问 FB 图形 API。因此,使用这些令牌,您可以访问用户的朋友列表、照片、喜欢、兴趣等(假设您在应用程序安装时请求了这样做的权限)。/me/permissions您可以通过使用用户访问令牌并在图形 api 上发出请求来检查您拥有哪些权限。

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 发布到用户的提要,如下所示:

<script type="text/javascript">
FB.api('/me/feed', 'post', { message: 'test!' }, function(response)
{
    //do things
});
</script>

但是,如果您希望代表用户从您的服务器调用 Graph API 以发布到他们的提要(或者您的需要要求您这样做),则您必须存储用户的 FB 用户 ID 以及您的用户数据,以便您以后可以访问它。FB.login该用户 ID 在传递给回调 ( response.authResponse.userID)的参数中可用。存储之后,您只需使用适当的数据,POST就可以代表您的用户从服务器进行 Graph API 调用:/<user_id>/feed

$ curl -d "message=test&access_token=<app_access_token>" /<user_id>/feed 

最后,重新验证您的用户。FB JS SDK 公开了 3 种身份验证方法。

FB.getAuthResponse和之间的主要区别在于FB.getLoginStatusgetAuthResponse在调用任何进一步的 javascript 之前等待来自 Facebook 的响应(它是阻塞的或同步的)。FB.getLoginStatus将允许其他 javascript 运行,并在收到响应时调用您提供的回调,允许您在等待响应时执行其他操作。这些方法中的任何一种都可用于确定您的用户当前是否登录到 Facebook,以及该用户是否安装了您的应用程序。然后,您可以使用FB.login(如果他们没有登录 FB,或者不是您的应用程序的用户)提示他们登录或安装,以便您可以访问他们的信息。如果用户已安装并已授权您的应用 ( response.authResponse.accessToken),这两种方法都会将用户的访问令牌传回给您。

FB.login检查用户的登录状态,但无论状态如何,它总是会弹出登录/安装对话框(如果他们已登录/安装,它将立即隐藏弹出窗口)。如果您需要向用户请求额外的权限,也可以使用该FB.login方法(假设您一开始只是获得“香草”安装,然后用户说他们希望您发布到他们的提要。当他们启动该选项时,您然后可以向他们请求扩展许可)。为了利用该功能,您可以FB.login像新用户一样使用,除了您在作为第二个参数传递的变量的scope属性中添加您想要/需要的扩展权限。options

tl;博士

使用FB.getAuthResponseFB.getLoginStatus来确定您的用户是否已登录并安装了您的应用程序。当您的用户正在使用您的应用程序时,这些方法还可用于获取新的访问令牌。

用于FB.login获取新的/未经身份验证的用户来安装您的应用程序。

一旦您的用户登录,获取他们的用户 ID 并将其存储在您的数据库中的某个位置。publish_action一旦您获得用户的许可,这可用于代表他们使用您的应用访问令牌发布

如果您想存储一个长期存在的用户访问令牌以访问用户的个人资料和其他信息,稍后,请使用上面的链接将您的用户访问令牌交换为扩展访问令牌。这是一个服务器端进程,您可以将生成的访问令牌与用户的其他凭据一起存储在数据库中。


抱歉,这么长和罗嗦 - 我只是想为您提供一些关于访问令牌、如何使用它们以及如何使用 JS SDK 来维护它们的可靠信息。希望这可以帮助。

于 2013-07-11T21:42:51.960 回答