我正在this reference工作,并尝试实施OAuth协议,以允许用户通过Facebook登录我的网站。然而,Facebook的文档非常糟糕,并且在一些关键部分还不清楚。
它说授权需要三个步骤:
用户身份验证(将用户重定向到https://facebook.com/dialog/oauth?client_id=...&redirect_uri=...
,并期望使用redirect_uri
回叫code
页面。效果很好!
应用授权(由Facebook等处理)。效果很好!
应用身份验证(在回调页面上,抓住您获得的code
并致电https://graph.facebook.com/oauth/access_token?client_id=...&redirect_uri=...&client_secret=...&code=...
。回复的正文将包含access_token
我们需要做的事情)
我理解使用access_token
,我可以调用API等。但是,当它到期时会发生什么?我可以得到一个新的,但到了这一点,以后会有很多HTTP请求,我不再拥有code
我以前得到它。我是否必须在code
旁边存储access_token
?或者,我是否必须告诉用户再次登录,以便获得新的code
以获得新的access_token
?
或者,我在这里错过了一个关键部分吗?我不需要offline_access
令牌,因为我只会轮询数据以响应用户操作。
答案 0 :(得分:25)
当access_token
到期时,用户将被Facebook视为“已退出”。您的应用将与第一次完成相同的过程,但用户可能不会。
如果用户尚未撤销对您应用的访问权限,并且用户当时已登录Facebook,则应用授权流程将自行处理,无需用户执行任何操作,您将收到新的access_token
。
如果用户尚未撤销对您应用的访问权限,但未登录Facebook,则会在应用授权步骤中向他们显示Facebook登录信息。他们不会被要求再次授予您的应用程序权限,因为Facebook知道您的应用程序ID已被该用户授权。
最后,如果用户已撤销访问权限,那么他们将会看到原始的App Authorization请求,您将按照原始流程进行操作。
基本上,您应该将access_token
视为易失性,而不是将其存储起来,而是使用您在用户登录过程中收到的access_token
,这种情况一直发生在幕后,并且仅在用户退出Facebook或撤销对您的应用程序的访问权限时涉及用户。
这与Twitter的OAuth不同,您可以使用它来存储和重复使用它。
答案 1 :(得分:5)
来自您问题中链接的Facebook文档:
令牌过期后,您需要重新执行上述步骤 生成新代码和access_token,但如果用户已经 授权您的应用程序,不会再次提示他们这样做。
当access_token
到期时,您需要通过相同的步骤返回一个新的。用户必须再次登录,您必须获得新的code
,然后又需要新的access_token
。