无法使用Facebook进行OAuth;接下来该怎么调试?
我有一个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
结果总是response
是None
,而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
的值必须和你请求代码时的值完全一致。因为在请求令牌的时候并不会真的进行重定向,所以很容易忽略一些小的差别。在这种情况下,错误信息并没有特别清楚地说明问题;它的意思其实是“你发送的参数和你发送的代码值不匹配”。