使用 django-rest-auth 和 allauth 进行 Google 身份验证

Posted

技术标签:

【中文标题】使用 django-rest-auth 和 allauth 进行 Google 身份验证【英文标题】:Google authentication using django-rest-auth and allauth 【发布时间】:2021-01-19 11:43:38 【问题描述】:

我正在尝试为 Flutter 应用程序创建一个身份验证 API,该应用程序将使用谷歌身份验证注册/登录表单登录用户。我遵循了这个tutorial 来实现这一点。

到目前为止一切都很好,只是本教程基于 GitHub 登录而不是 Google。我设法让它工作到“连接”步骤。我可以从重定向中获取code,但是当我访问http://127.0.0.1:8000/auth/google/ 时,我看到它要求两个字段(access_tokencode)。当我尝试只发布我拥有的信息时,我收到以下错误:

 "non_field_errors": [
        "View is not defined, pass it as a context variable"
]

【问题讨论】:

我今天早些时候遇到了同样的问题。就我而言,之前一切都运行良好,并且在升级我的一些项目的需求库之后出现了这个错误。但是,我决定摆脱 django-rest-auth 并用github.com/jazzband/dj-rest-auth 替换它,这是原始项目的更积极维护的分支。现在,一切都像魅力一样运作。希望这会有所帮助! @JuhoEnala 我今天会尝试做同样的事情。感谢您提供此信息。希望它能解决我的问题 【参考方案1】:

这是与 djangorestframework => 3.12 的版本冲突错误 解决方案:降级到 djangorestframework

【讨论】:

【参考方案2】:

我想在 JACKSON MOURA 代码 sn-p 中添加详细信息并附上解释。

在 settings.py 中,你必须这样做。我没有找到任何好的文档。但它适用于社会认证。现在您不再需要使用管理面板来设置社交身份验证应用程序了。我展示了 Google、Facebook 和 LinkedIn 的示例。它也适用于其他社交应用程序。

SOCIALACCOUNT_PROVIDERS = 
    "google": 
        "APP": 
            "client_id": "<client_id>",
            "secret": "<secret>",
        ,
    ,
    'facebook': 
        "APP": 
            "client_id": "<client_id>",
            "secret": "<secret>",
        ,
    ,
    "linkedin": 
        "APP": 
            "client_id": "<client_id>",
            "secret": "<secret>",
        
    

现在在 view.py 中,您必须创建序列化程序类。一切都会一样。我正在为 Google、LinkedIn 和 Facebook 展示。

class FacebookLogin(SocialLoginView):
    adapter_class = FacebookOAuth2Adapter
    client_class = OAuth2Client
    serializer_class = SocialLoginSerializer

    def get_serializer(self, *args, **kwargs):
        serializer_class = self.get_serializer_class()
        kwargs['context'] = self.get_serializer_context()
        return serializer_class(*args, **kwargs)


class GoogleLogin(SocialLoginView):
    adapter_class = GoogleOAuth2Adapter
    client_class = OAuth2Client
    serializer_class = SocialLoginSerializer

    def get_serializer(self, *args, **kwargs):
        serializer_class = self.get_serializer_class()
        kwargs['context'] = self.get_serializer_context()
        return serializer_class(*args, **kwargs)


class LinkedInLogin(SocialLoginView):
    adapter_class = LinkedInOAuthAdapter
    client_class = OAuthClient
    serializer_class = SocialLoginSerializer

    def get_serializer(self, *args, **kwargs):
        serializer_class = self.get_serializer_class()
        kwargs['context'] = self.get_serializer_context()
        return serializer_class(*args, **kwargs)

现在,后端已准备好从前端获取帖子数据,并将显示如下完美错误。它适用于所有其他社交应用。

【讨论】:

【参考方案3】:

这是因为 rest_auth 不再维护,并且与最新版本的 Django Rest Framework 不兼容。

这个错误在切换到dj-rest-auth而不是rest_auth时得到解决,它是原始项目的积极维护的分支。

【讨论】:

【参考方案4】:

试试这个:

class GoogleLogin(SocialLoginView):
    adapter_class = GoogleOAuth2Adapter
    client_class = OAuth2Client
    serializer_class = SocialLoginSerializer

    def get_serializer(self, *args, **kwargs):
        serializer_class = self.get_serializer_class()
        kwargs['context'] = self.get_serializer_context()
        return serializer_class(*args, **kwargs)


google_login = GoogleLogin.as_view()

【讨论】:

以上是关于使用 django-rest-auth 和 allauth 进行 Google 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以更改登录的 Django-rest-auth 视图?

如何在 DRF + django-rest-auth 中使用自定义用户模型保存注册时的额外字段

如何使用 django-rest-auth 和 Mailgun 从 Django 发送密码重置电子邮件

Django-rest-auth和AWS - 错误401

django-rest-auth vs djoser,哪一个用于社交身份验证?

django-rest-auth 自定义注册无法保存额外字段