使用django-rest-auth和allauth

问题描述

我正在尝试为Flutter应用创建身份验证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

解决方法

我想在 JACKSON MOURA 代码段中添加详细信息和说明。

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

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

现在在 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,**kwargs)


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

    def get_serializer(self,**kwargs)

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

enter image description here

,

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

,

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

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

,

尝试一下:

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

    def get_serializer(self,**kwargs)


google_login = GoogleLogin.as_view()