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

问题描述 投票:0回答:5

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

到目前为止一切顺利,只是本教程是基于 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"
]

python-3.x django django-rest-framework django-allauth django-rest-auth
5个回答
6
投票

这是 djangorestframework => 3.12 的版本冲突错误 解决方案:降级到djangorestframework <= 3.11.0 and everything should be fine.


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
投票

我想在 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)

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


4
投票

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

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


0
投票

我对 dj-rest-auth 的

UUID
主键有问题,恢复默认
id
字段后它开始工作 https://github.com/iMerica/dj-rest-auth/issues/551#issuecomment- 1858911936

我使用 django-allauth 和 dj-rest-auth 的示例

用户/views.py

class GoogleLoginRedirect(RedirectView):
    url = "https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=<REDIRECT_URL(WITH OUT SLASH IN THE END)>&prompt=consent&response_type=code&client_id=<CLIENT_ID>&scope=openid%20email%20profile&access_type=offline"
    permanent = True

    def get_redirect_url(self, *args, **kwargs):
        return self.url


import requests
class GoogleCallback(View):
    def get(self, request, *args, **kwargs):
        code = request.GET["code"]
        response = requests.post("http://localhost:8000/dj-rest-auth/google/", json={
            "code": code
        })

        django_response = HttpResponse(
            content=response.content,
            status=response.status_code,
        )
        for k, v in response.headers.items():
            django_response[k] = v

        return django_response

url.py

    path('dj-rest-auth/google/', GoogleLogin.as_view(), name='google_login'),
    path("dj-rest-auth/google/login/", view=GoogleLoginRedirect.as_view(), name="google_redirect"),
    path("dj-rest-auth/google/callback/", view=GoogleCallback.as_view(), name="google_callback"),

UUID 主键不适用于 django-allauth = "~0.56.1" dj-rest-auth =“~5.0.2”

© www.soinside.com 2019 - 2024. All rights reserved.