我有一个Django模板,通过执行以下操作来启动Facebook OAuth process:
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
不是问题。
我已手动逐步执行代码,打印FB返回的code
,
然后在python解释器中逐行手动运行上面的代码,并且
我看不出任何我做错的事。我的下一个调试步骤是什么? FB
如果您收到OAuthException
,则文档提供的指导很少。
答案 0 :(得分:3)
当您请求令牌时,redirect_uri
使用的值必须与您请求代码时的值完全相同。由于在请求令牌时没有发生实际的重定向,因此很容易错过小的差异。在这种情况下,错误消息不是特别描述的;它的真正含义是“您发送的参数与您发送的代码值不符”。