使用django-rest-framework和python-social-auth实现谷歌身份验证

5

简要问题: 使用DRF、python-social-auth和Angularjs登录可以使用Facebook,但无法使用Google。

我正在构建一个Django应用程序,需要使用户能够通过Facebook和Google进行注册/登录,以及本地存储的电子邮件/密码组合。它的工作方式如下:

  1. Angularjs会使用FB和Google的api(FB.init和gapi.auth2.init)来初始化注册和登录,这需要使用它们各自的app_id。所有此类js库都已包含在页面中。
  2. 根据用户的选择,这两个页面允许用户使用Facebook或Google进行登录,或者让他们输入其电子邮件/密码组合。
  3. 通过FB或Google的API收集所有必需信息,包括它们的access_token
  4. 当用户填写完所有相关细节(注册需要他们输入一些附加数据)并提交表单时,通过AJAX请求将数据(包括access_token)发送到服务器。
  5. 在服务器端,基于类的视图LoginView和SignUpView接受请求并处理它们。代码直接处理基于电子邮件的注册/登录。Google/FB基于注册/登录则将其传递给python-social-auth的do_auth函数进行认证。
  6. 当所选提供商为facebook时,这可以正常工作。但当所选为Google时(尝试了google-oauth2google-plus),do_auth最终会引发403 Forbidden错误。当复制相关的url https://googleapis.com/plus/v1/people/me?access_token=ACCESS_TOKEN&alt=json 到浏览器时,它会显示错误消息:
每日未经身份验证使用限制已超过。继续使用需要注册。
我已确保以下事项:
1. 在相应应用程序的谷歌开发者控制台中启用了Google+ API。 2. 从谷歌开发者控制台中,将http://localhost:5001添加到javascript origin字段,将http://localhost:5001/social/complete添加到redirect uri字段(后一个字段稍后填写。有无都可以得到相同结果)。 3. 生成密钥并将client_id和client_secret复制到settings.SOCIAL_AUTH_GOOGLE_OAUTH2_KEY和settings.SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET中。仔细检查它们的准确性。 4. 将social.backends.google.GoogleOAuth2添加到settings.AUTHENTICATION_BACKENDS。尝试在此处同时或分别放置GoogleOAuth2和GooglePlus。 5. 尝试使用PLUS一起进行2-3次尝试,而不是OAUTH2。结果仍然相同。 6. 尝试在将settings.SOCIAL_AUTH_USE_DEPRECATED_API设置为True后再次尝试。这也失败了,但错误现在是401。

我该怎么做才能让它与Google身份验证一起使用?已经查看了许多类似的问题和在Github上报告的问题。

以下是相关代码:

class SignUpView(CreateAPIView):

    def create(self, request, *args, **kwargs):
        provider = request.data['provider']
        strategy = load_strategy(request)
        backend = load_backend(strategy=strategy, name=provider, redirect_uri=None)
        token = request.data['access_token']
        try:
            user = backend.do_auth(token, user=None, **data)
        except AuthAlreadyAssociated:
            pass

发现@aragen的回复与我的问题相关:https://dev59.com/eV4c5IYBdhLWcg3wLXka#28355531。我正在按照您的方法进行,您有什么想法吗? - Rajeesh Punathil
1个回答

5

我最近遇到了类似的问题,但我的情况有点不同,因为我正在使用django-rest-framework-social-oauth2。

首先,我注意到您已启用Google+ API,但是:

将 'social.backends.google.GoogleOAuth2' 添加到 settings.AUTHENTICATION_BACKENDS 中。

请尝试更改您的设置为以下内容(在Python社交认证文档中有描述):

AUTHENTICATION_BACKENDS = (
...
'social_core.backends.google.GooglePlusAuth',
)

SOCIAL_AUTH_GOOGLE_PLUS_KEY = '...'
SOCIAL_AUTH_GOOGLE_PLUS_SECRET = '...'

对你有用的另一件事是谷歌OAuth沙盒

。它与OAuth相关,可以帮助你测试和调试OAuth认证请求和响应,以确保你的代码正确地实现了OAuth。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接