通过访问令牌进行的 Python Social auth 身份验证失败
Posted
技术标签:
【中文标题】通过访问令牌进行的 Python Social auth 身份验证失败【英文标题】:Python Social auth authentication via access-token fails 【发布时间】:2014-12-02 20:40:36 【问题描述】:我目前正在使用 Django (1.7) 开发一个 serverbackand,它应该使用 python-social-auth 通过社交网络处理身份验证。 我关注了这个网站上的Tutorial,它描述了一个简单的 Webapp 的过程。 这非常适合 Google 和 Twitter 登录。
由于服务器应该只是一个 REST-FULL 后端,我决定在客户端获取访问令牌并将其发送到服务器。 服务器将对其进行身份验证。这个过程应该没有问题,甚至在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”。
感谢您与我一起撰写长篇文章,我希望有人知道可能出了什么问题 :)。 期待您的回答。
【问题讨论】:
那么你想让它与 GoogleOAuth2 一起工作吗? (我只是很困惑,因为您说“这非常适合 Google 和 Twitter 登录。”)。你为什么要覆盖social:complete
视图? (同样在不相关的说明中,您可能想改用GooglePlusAuth
,因为我相信谷歌将在几个月内关闭 OAuth2 的注册,请参阅developers.google.com/+/api/auth-migration
我只问你为什么要覆盖它,因为最近我使用 python-social-auth 将 google 社交登录添加到我的 Django 网站,但我没有这样做,我想管道会是任何自定义代码的地方......所以我很好奇你想要实现什么。
看起来错误是在 psa 中的 social.apps.django_app.utils
中引发的,这会导致您进入 social.backends.utils
、get_backend
这引发异常...为什么不将一些带有相关变量的打印语句放在那里看看发生了什么..
嘿,我从不覆盖 social:complete 视图。这个 @ 参数只是一个装饰器,确实为视图提供了更多数据。我必须做更多的事情,因为我正在尝试使用 Django 作为 REST 服务器,默认情况下根本没有状态(因此没有会话 :()。如果我使用默认会话系统,那么工作正常的部分就是我在开头发布的教程。感谢谷歌关闭 OAuth2 的提示我不知道。
@Dominik 你还有这个问题吗?如果是这样,似乎 psa 装饰器正在提高 Http404,那么您能否提供围绕 this line in psa code 的完整回溯?如果你解决了,请发表你的答案
【参考方案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 参数中传递 access_token,这是错误的。
【讨论】:
以上是关于通过访问令牌进行的 Python Social auth 身份验证失败的主要内容,如果未能解决你的问题,请参考以下文章
使用python social auth通过access token注册用户
使用现有用户访问令牌使用 Spring Social 登录 Facebook
python-social-auth AuthCanceled 异常