2013-02-27 214 views
0

我已经测试过这个,它的工作。现在错误又回来了,我没有对我的社交应用程序做任何更改。KeyError:访问令牌

这里是我的代码:

def get_profile(request, token=None): 
    args = { 
     'client_id': settings.FACEBOOK_APP_ID, 
     'client_secret': settings.FACEBOOK_APP_SECRET, 
     'redirect_uri': request.build_absolute_uri(reverse('social:fb_callback')), 
     'code': token, 
    } 

    target = urllib.urlopen('https://graph.facebook.com/oauth/access_token?' + urllib.urlencode(args)).read() 
    response = cgi.parse_qs(target) 
    access_token = response['access_token'][-1] 

    return access_token 

回答

1

很显然,你的要求是不是成功,响应不具有访问令牌。根据Facebook的文档,当请求是不好的,它会返回一个错误元素的响应,是这样的:

{ 
    error: { 
    message: "Missing redirect_uri parameter.", 
    type: "OAuthException", 
    code: 191 
    } 
} 

所以,在你的函数,你应该这样做:

class FacebookAccessException(Exception): pass 

def get_profile(request, token=None): 
    ... 
    response = json.loads(urllib_response) 
    if 'error' in response: 
     raise FacebookAccessException(response['error']['message']) 

    access_token = response['access_token'][-1] 
    return access_token 

PS:

尝试使用更好的urllib。你应该尝试Requests

+0

Facebook有可能不会给出访问令牌吗? – catherine 2013-02-27 02:27:34

+0

确实,您应该查看Facebook文档。 – santiagobasulto 2013-02-27 13:44:09