简单问题:使用 DRF 登录、python-social-auth 和 Angularjs 适用于 Facebook,但不适用于 Google。
我正在构建一个 django 应用程序,除了本地存储的电子邮件/密码组合之外,它还需要允许用户通过 Facebook 和 Google 注册/登录。其工作原理如下:
- 对于注册和登录,Angularjs 使用各自的 app_ids 启动 FB 和 google api(FB.init 和gapi.auth2.init)。页面中包含了所需的所有 js 库。
- 根据用户的选择,两个页面都允许用户使用 Facebook 或 Google 登录或输入电子邮件/密码组合。
- 包括
access_token
在内的所有必需信息均通过 FB 或 Google 的 API 收集。 - 当用户填写所有相关详细信息后提交表单(注册要求他们输入一些附加数据)时,包括
access_token
的数据将通过 AJAX 请求发送到服务器。 - 在服务器端,基于类的 View (LoginView 和 SignUpView)接受请求并处理它们。基于电子邮件的注册/登录由代码直接处理。基于 Google/FB 的注册/登录会传递给 python-social-auth 的
do_auth
函数进行身份验证。 - 当选择的提供商是
facebook
时,效果很好。当,它是Google
(尝试了google-oauth2
和google-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
- 我已确定以下事项:
- 在 Google 开发者控制台中为相应应用启用了 Google+ API
- 在 Google 开发者控制台中,将
http://localhost:5001
添加到 javascript origin 字段,并将http://localhost:5001/social/complete
添加到重定向 uri字段(后一个字段稍后填写。有或没有它的结果相同。) - 已生成 key 并将 client_id 和 client_secret 复制到
settings.SOCIAL_AUTH_GOOGLE_OAUTH2_KEY
和settings.SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET
。仔细检查其准确性。 - 在 settings.AUTHENTICATION_BACKENDS 中添加了
'social.backends.google.GoogleOAuth2'
。尝试将 GoogleOAuth2 和 GooglePlus 放在一起或分开放置。 - 也使用 PLUS(而不是 OAUTH2)在 2-3 中尝试了所有这些。结果还是一样。
- 设置后重试,
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/