简要问题: 使用DRF、python-social-auth和Angularjs登录可以使用Facebook,但无法使用Google。
我正在构建一个Django应用程序,需要使用户能够通过Facebook和Google进行注册/登录,以及本地存储的电子邮件/密码组合。它的工作方式如下:
- Angularjs会使用FB和Google的api(FB.init和gapi.auth2.init)来初始化注册和登录,这需要使用它们各自的app_id。所有此类js库都已包含在页面中。
- 根据用户的选择,这两个页面允许用户使用Facebook或Google进行登录,或者让他们输入其电子邮件/密码组合。
- 通过FB或Google的API收集所有必需信息,包括它们的
access_token
。 - 当用户填写完所有相关细节(注册需要他们输入一些附加数据)并提交表单时,通过AJAX请求将数据(包括
access_token
)发送到服务器。 - 在服务器端,基于类的视图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 到浏览器时,它会显示错误消息:
我已确保以下事项:
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