django-rest-framework - 使用 django-rest-framework 和 python-social-auth 进行 Google 身份验证

标签 django-rest-framework python-social-auth

简单问题:使用 DRF 登录、python-social-auth 和 Angularjs 适用于 Facebook,但不适用于 Google。

我正在构建一个 django 应用程序,除了本地存储的电子邮件/密码组合之外,它还需要允许用户通过 Facebook 和 Google 注册/登录。其工作原理如下:

  1. 对于注册和登录,Angularjs 使用各自的 app_ids 启动 FB 和 google api(FB.init 和gapi.auth2.init)。页面中包含了所需的所有 js 库。
  2. 根据用户的选择,两个页面都允许用户使用 Facebook 或 Google 登录或输入电子邮件/密码组合。
  3. 包括 access_token 在内的所有必需信息均通过 FB 或 Google 的 API 收集。
  4. 当用户填写所有相关详细信息后提交表单(注册要求他们输入一些附加数据)时,包括 access_token 的数据将通过 AJAX 请求发送到服务器。
  5. 在服务器端,基于类的 View (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复制到浏览器时,会显示错误消息:

Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup

  • 我已确定以下事项:
    1. 在 Google 开发者控制台中为相应应用启用了 Google+ API
    2. 在 Google 开发者控制台中,将 http://localhost:5001 添加到 javascript origin 字段,并将 http://localhost:5001/social/complete 添加到重定向 uri字段(后一个字段稍后填写。有或没有它的结果相同。)
    3. 已生成 key 并将 client_id 和 client_secret 复制到 settings.SOCIAL_AUTH_GOOGLE_OAUTH2_KEYsettings.SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET。仔细检查其准确性。
    4. 在 settings.AUTHENTICATION_BACKENDS 中添加了'social.backends.google.GoogleOAuth2'。尝试将 GoogleOAuth2 和 GooglePlus 放在一起或分开放置。
    5. 也使用 PLUS(而不是 OAUTH2)在 2-3 中尝试了所有这些。结果还是一样。
    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
    

    最佳答案

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

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

    Added 'social.backends.google.GoogleOAuth2' to settings.AUTHENTICATION_BACKENDS.

    尝试将您的设置更改为(python social auth docs 中对此进行了描述):

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

    另一件事对您有用是 google oauth playground

    关于django-rest-framework - 使用 django-rest-framework 和 python-social-auth 进行 Google 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41772057/

    相关文章:

    Django Rest Framework 类别和子级在一个模型中

    javascript - axios如何获取.catch()中的状态码?

    当我尝试获取 access_token 时,Python-social-auth 管道返回 TypeError

    python - 无法使用 python-social-auth 断开用户连接(错误 405)

    Python Social Auth,扩展断开管道

    django - 为什么 Django/Django REST Framework 不深入验证 CSRF token ,即使使用 enforce-CSRF?

    ios - Django 休息框架日期时间字段格式

    python - 找不到 Facebook 后端

    python - 需要字段的 django rest 框架错误