使用django-rest-auth和allauth实现Google身份验证

7
我正在尝试为Flutter应用程序创建一个身份验证API,该API将使用Google身份验证注册/登录表单来登录用户。我遵循了这个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"
]

enter image description here


3
今天早些时候我遇到了完全相同的问题。在我的情况下,之前一切都正常工作,但在升级一些项目需求库后出现了这个错误。然而,我决定摆脱django-rest-auth并用https://github.com/jazzband/dj-rest-auth来替换它,后者是原始项目更活跃维护的分支。现在,一切都像魔法般地工作。希望这可以帮助你! - Juho Enala
@JuhoEnala 我今天会尝试做同样的事情。谢谢你提供这个信息。希望它能解决我的问题。 - Marco Fernandes
4个回答

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()

4

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

通过切换到dj-rest-auth而不是rest_auth,可以解决此错误,后者是原始项目的积极维护的分支。


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>",
        }
    }
}

现在在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)

现在,后端已经准备好从前端获取文章数据,并将显示完美的错误信息,如下图所示。它将与所有其他社交应用程序一起使用。 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接