不能使用Facebook OAuth获得访问令牌


Can't get access token using Facebook OAuth

大约一周前Facebook登录我的网站工作正常,但现在当我试图检索访问令牌使用"代码"我得到错误"此授权码已被使用"。我查阅了很多文档和建议,但没有任何结果。

步骤复制(使用FB PHP SDK):

  1. 发送用户到FB授权与正确的urlencoded返回uri(带尾斜杠):

    https://www.facebook.com/dialog/oauth?client_id=[my_cid]&redirect_uri=http%3A%2F%2Fmydomain.com%2Fauth%2Ffacebook%2F&state=e15e0894cd922098f9f8f340c820538d&scope=email&display=page
    
  2. 在我的重定向uri上接收代码参数(一切正常)

  3. 发送访问令牌请求:

    https://graph.facebook.com/oauth/access_token?client_id=[my_cid]&redirect_uri=http%3A%2F%mydomain.com%2Fauth%2Ffacebook%2F&client_secret=[my_secret]&code=[long_code_goes_here]
    

我也试过不urlencoded redirect_uri。

为什么?

这是由于到目前为止Facebook的变化一直是可选的,但将于12月5日对所有人推出。从开发者路线图的12月12日突破性的变化:

OAuth授权码的新安全限制我们只会允许一次和一次将授权码交换为访问令牌是否要求在10年内将它们交换为访问令牌他们创造的几分钟。这与OAuth 2.0规范是一致的从一开始就声明"授权代码必须是?寿命短,一次性使用"。更多信息,请查看我们的验证文档。

因此,当您第一次为用户获得access_token时,您需要存储它,然后在下一次用户需要与FBAPI交互时显式设置它:$facebook->setAccessToken($theToken);