55

据我了解,简而言之,这是使用 OAuth2 API 的新 Facebook iframe 画布应用程序的基本过程:

  1. 重定向到(或让用户单击链接到)应用的授权 URL
  2. 用户授权并被重定向到您的回调 URL
  3. 回调使用“code”参数获取访问令牌
  4. 访问令牌与 Graph API 一起用于拉取或推送信息

问题是访问令牌过期相对较快并且需要“刷新”,所以我的问题是 1)除了尝试使用令牌并简单地收到错误之外,您如何检测令牌已过期?2) 获得新令牌的最佳做法是什么?

目前,我只是检测到尝试使用他们的访问令牌获取用户信息时出错,然后再次重定向到授权 URL——因为他们已经授权了应用程序,一个空白页面闪过,他们被重定向回我的应用程序回调我得到一个新令牌的地方。它太笨重了,我不敢相信这是正确的方法。

4

6 回答 6

42
  1. 判断 cookie 是否有效的唯一方法是使用它并在它过期时捕获错误。没有轮询方法或任何东西来检查令牌是否有效。

  2. 要获取新令牌,只需将用户再次重定向到身份验证页面。因为他们已经授权了您的应用程序,所以他们将立即被重定向回您的应用程序,并且您将拥有一个新令牌。他们不会被提示允许,因为他们已经这样做了。

简而言之,这没有任何技巧。你已经正确地做到了。

于 2011-01-07T04:23:26.120 回答
27

最近,facebook 对访问令牌进行了一些更改,允许它们定期刷新。

https://graph.facebook.com/oauth/access_token?
client_id=APP_ID&
client_secret=APP_SECRET&
grant_type=fb_exchange_token&
fb_exchange_token=EXISTING_ACCESS_TOKEN 

有关更多详细信息,请在此处查看:https ://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal

于 2012-04-12T22:20:10.020 回答
4
//you just need more step because the access token you are getting will expire in 1 hour
    //you can overcome this in step 5

    1-Redirect to (or have user click link to) app's authorization URL
2-User authorizes and is redirected to your callback URL
3-Callback uses "code" parameter to get a access token
4-Access token is used with Graph API to pull or push information
    5-exchange short-lived access token you just got with 60 day access token
    https://graph.facebook.com/oauth/access_token?client_id=APP_ID&client_secret=APP_SECRET&grant_type=fb_exchange_token&fb_exchange_token=EXISTING_ACCESS_TOKEN
    6-after 60 day the user must login again to your app and the steps from 1-5 will be repeated.
    --the real problem you will face is how to make the user visit your app page again
于 2013-07-31T14:37:48.347 回答
4

Facebook 删除了“代表”模式下刷新访问令牌的功能。最好和最简单的方法是将用户重定向到 facebook 登录页面以重新验证应用程序。在此处查找facbook 文档

于 2014-06-19T08:57:52.820 回答
2

如果用户已经授权您的应用程序并且访问令牌已过期。您可以再次将用户重定向到身份验证页面。但 oauth 对话框不显示,因为用户已经授权您的应用程序。他将重定向到您使用的 redirect_url 参数。

于 2013-02-04T04:02:50.220 回答
-3

{“错误”:{“消息”:“缺少redirect_uri参数。”,“类型”:“OAuthException”,“代码”:191,“fbtrace_id”:“BHvng7s53ra”}}

于 2017-04-09T11:43:03.227 回答