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

Mar*_*des 6 django python-3.x django-rest-framework django-allauth django-rest-auth

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

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

 "non_field_errors": [
        "View is not defined, pass it as a context variable"
]
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

小智 6

这是 djangorestframework => 3.12 的版本冲突错误 解决方案:降级到 djangorestframework <= 3.11.0 一切都应该没问题。


小智 5

尝试这个:

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()
Run Code Online (Sandbox Code Playgroud)


小智 4

我想在 JACKSON MOURA 代码片段中添加详细信息和解释。

在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>",
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在 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)
Run Code Online (Sandbox Code Playgroud)

现在,后端已准备好从前端获取发布数据,并将显示如下完美错误。它将与所有其他社交应用程序一起使用。

在此输入图像描述