django-rest-auth 文档讨论了 Facebook 集成,我对此不感兴趣——我关心的是通过 Google 提供社交登录。我已经尝试了很长时间了,我想知道是否有其他人有任何关于他们如何做到这一点的文档......即使只是一个粗略的草图也会有所帮助。到目前为止,我还没有找到此搜索的任何结果。我快到了,但无法让它与 Django 休息框架 (DRF) 可浏览 API 一起工作。
这是我到目前为止所拥有的:我从 django-rest-auth github 页面上提供的演示项目开始,并修改了社交登录模板 HTML 页面,只需要输入“代码”,而不需要同时输入“代码”和“访问令牌” . 当我提供有效代码(通过对谷歌的身份验证端点的单独请求获得)时,这可以正常工作;可浏览的 API 在响应中使用“密钥”(我的应用程序的用户 API 令牌)呈现通常的网页。检查 django 管理员,一切正常 - 用户已登录,电子邮件已通过身份验证等。到目前为止很好。
问题是提供“代码”的起点——以及我首先如何从谷歌获得该代码。当我之前(成功)使用 allauth 包时,我可以简单地单击一个链接,这将“隐形”执行整个 OAuth2 流程(即请求代码,使用该代码获取访问令牌,并使用访问令牌来获取用户的谷歌账户信息)。
为了重新创建无缝流程(即不从代码开始),我想我可以中断 OAuth2 流程并“拦截”从 google 返回的代码,然后将该代码发布到 rest-auth 社交登录 API。为此,我allauth.socialaccount.providers.oauth2.views.OAuth2CallbackView通过重写 dispatch 方法创建了一个自定义:
class CustomOAuth2CallbackView(OAuth2CallbackView):
def dispatch(self, request):
# gets the code correctly:
code = request.GET['code']
# rp is of type requests.methods.Response
rp = requests.post(<REST-AUTH API ENDPOINT>, data = {'code':code})
return rp
通常,当 google 向您最初提供给 google 的 auth 端点的回调 uri 发送 GET 请求时,会调用此方法。有了这个覆盖,我就能够成功地解析谷歌在该回调中返回的代码。POST 请求有效,并且在 resp._content 字段中有用户的密钥。但是,它最终无法在 DRF 可浏览 API 中生成预期的视图。
基于深入调用堆栈,我发现它rest_framework.views.APIView.dispatch返回了一个类型的对象rest_framework.response.Response。但是,当requests.post上面使用的方法完成时,它会返回一个 type 的实例requests.models.Response。结果,它没有正确的属性并且在 django 中间件中失败。例如,它没有acceptable_renderer属性,也没有 'get' 方法(在 中使用django.middleware.clickjacking.py)。可以想象,我可以将这些要求添加到requests.models.Response( rp) 实例中,但随后这种 hack 变得更加杂乱无章。
感谢您的任何帮助,您可以提供!