通过访问令牌进行Python社交身份验证失败

时间:2014-10-08 08:43:45

标签: django access-token python-social-auth

我目前正在开发一个服务器和Django(1.7),它应该通过使用python-social-auth来处理社交网络的身份验证。 我按照本网站上的Tutorial进行了操作,该网站描述了简单Web应用程序的过程。 这适用于Google和Twitter登录。

由于服务器应该只是一个REST-FULL后端,我决定在客户端获取Access-Token并将其发送到服务器。 服务器将通过它进行身份验证。这个过程应该没问题,甚至可以作为python-social-auth文档中的一个例子。

但是,如果我确实设置了所有内容,我将收到一条错误消息:“后端未找到404”。

这是项目的一个最小部分:

settings.py :(我还包括API_KEY和SECRET)

AUTHENTICATION_BACKENDS = (
   #'social.backends.facebook.FacebookOAuth2',
   'social.backends.google.GoogleOAuth2',
   'social.backends.twitter.TwitterOAuth',
   'django.contrib.auth.backends.ModelBackend',
)

views.py(用于身份验证视图)

from django.contrib.auth import login

from social.apps.django_app.utils import psa

@psa('social:complete')
def register_by_access_token(request, backend):
    token = request.GET.get('access_token')
    user = request.backend.do_auth(request.GET.get('access_token'))
    if user:
        login(request, user)
        return 'OK'
    else:
        return 'ERROR'

我从文档中复制了海峡,只将backend.do_auth更改为request.backend.do_auth。这似乎是文档中的错误。

urls.py:

...
url(r'^register-by-token/(?P<backend>[^/]+)/$', 'register_by_access_token')
...

同样如文档中所述。

我只是试图让这个只适用于google-oauth,因为有一个简单的js-lib可以为你提供访问令牌。 这也很有效,我发送了一个请求

GET http://localhost:8000/register-by-token/google-oauth2/<access-token>/

如上所述,返回是未找到的404后端。 我做了一些调试,发现登录函数中引发的错误不是后端的do_auth()函数。 因此,实际的身份验证过程有效。我还尝试使用随机生成的字符串作为令牌并得到相应的错误,用户无法进行身份验证。

有趣的是,用户甚至拥有一个属性后端,它可以保留“social.backends.google.GoogleOAuth2”。

谢谢你,如果你和我一起留了很长的帖子,我希望有人知道可能出错的地方:)。 期待您的回答。

1 个答案:

答案 0 :(得分:1)

register_by_access_token视图中,您将获得GET参数中的access_token

user = request.backend.do_auth(request.GET.get('access_token'))

你定义的网址是:

url(r'^register-by-token/(?P<backend>[^/]+)/$', 'register_by_access_token')

所以你需要请求类似的东西:

GET http://localhost:8000/register-by-token/google-oauth2/?access_token=<access_token>

然而,你正在做:

GET http://localhost:8000/register-by-token/google-oauth2/<access-token>/

你在url params中传递access_token,这是错误的。