无法使用Facebook进行OAuth;接下来该怎么调试?

0 投票
1 回答
1306 浏览
提问于 2025-04-17 05:36

我有一个Django模板,它通过以下方式启动了Facebook的OAuth流程

window.location='https://www.facebook.com/dialog/oauth?client_id=MY_CLIENT_ID&redirect_uri=http%3A//localhost%3A8000/fbpanel/explore-python'

然后,在我的Django视图中,我获取到的结果代码如下:

import cgi
import urllib

# [...]

code = request.GET['code']
args = {
    'client_id': MY_CLIENT_ID,
    'redirect_uri': 'http://localhost:8000/fbpanel/explore_python'
    'client_secret': MY_CLIENT_SECRET,
    'code': code,
}
url = 'https://graph.facebook.com/oauth/access_token?' + \ 
        urllib.urlencode(args)

raw_response = urllib.urlopen(url).read()
response = cgi.parse_qs(raw_response)    

if response:
    error = ''
    if response['access_token']:
        access_token = response['access_token'][0]
    if response['expires']:
        expires = response['expires'][0]
else:
    access_token = 'No access token returned'
    expires = 'No expiration given'
    error = raw_response

结果总是responseNone,而raw_response里包含Error: {"error":{"message":"Error validating verification code.","type":"OAuthException"}}

同样的凭证在JavaScript SDK中验证得很好。我在那种情况下也是把我的服务器绑定到localhost,而且我的官方应用域名里也设置了localhost:8000。在我这样做之前,JavaScript是无法工作的。之后就可以了。所以我觉得localhost不是问题所在。

我手动逐行检查了代码,打印出Facebook返回的code,然后在Python解释器中逐行运行上面的代码,我看不出我哪里做错了。接下来我该怎么调试呢?Facebook的文档对收到OAuthException的情况几乎没有提供指导。

1 个回答

3

在请求令牌时,redirect_uri的值必须和你请求代码时的值完全一致。因为在请求令牌的时候并不会真的进行重定向,所以很容易忽略一些小的差别。在这种情况下,错误信息并没有特别清楚地说明问题;它的意思其实是“你发送的参数和你发送的代码值不匹配”。

撰写回答