一个非常愚蠢的问题,但我已经盯着这个几个小时了,找不到我做错了什么。
我正在尝试使用 Python 通过 Facebook API 进行身份验证,但在请求用户访问令牌时遇到问题。 收到代码后,我向 https://graph.facebook.com/oauth/access_token 提出如下请求:
conn = httplib.HTTPSConnection("graph.facebook.com")
params = urllib.urlencode({'redirect_uri':request.build_absolute_uri(reverse('some_app.views.home')),
'client_id':apis.Facebook.app_id,
'client_secret':apis.Facebook.app_secret,
'code':code})
conn.request("GET", "/oauth/access_token", params)
response = conn.getresponse()
response_body = response.read()
作为回应,我收到
{"error":{"message":"缺少redirect_uri参数.","type":"OAuthException","code":191}}
任何想法可能出错? 我已经验证了正在传递的redirect_uri在应用程序域上,但是这是否是在本地托管并且该域只是通过我的主机文件重定向到localhost的问题?
感谢您的帮助!
编辑:
我使用请求库得到了这个工作:
params = {'redirect_uri':request.build_absolute_uri(reverse('profiles.views.fb_signup')),
'client_id':apis.Facebook.app_id,
'client_secret':apis.Facebook.app_secret,
'code':code}
r = requests.get("https://graph.facebook.com/oauth/access_token",params=params)
但是,当应该在本地支持它而没有太多困难时,我仍然更愿意依赖库。 也许这要求太多了...
在你的第一个例子(使用 HTTPSConnection
的那个)中,您在请求正文中传递params
:
conn.request("GET", "/oauth/access_token", params)
这是不正确的(GET请求不应该有正文)。相反,参数应作为查询字符串传递网址的一部分:
conn.request("GET", "/oauth/access_token?" + params)