Django Google 登录与 React 前端

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

这个问题可能非常简单,但我已经搜索了一段时间,但还没有找到确切的解决方案。

我正在尝试使用 React 作为前端,使用 Django 作为后端来实现 Google 登录。

我具体该怎么做?我见过一些解决方案,其中将令牌发送到后端,然后后端从 Google API 检索必要的信息,并根据令牌从数据库创建或检索用户。然而,这似乎是基于 JWT,我想知道是否可以使用简单的 Django Auth Token 来实现相同的功能?

也许我真的很盲目,但我真的找不到合适的解决方案。

感谢您的帮助!

django reactjs google-authentication
2个回答
16
投票

在过去多次失败之后,我不久前实际上正在研究这个问题。试图找到一个适用于 React 的解决方案确实是一件令人头疼的事情。然而,我已经成功地使用 https://www.npmjs.com/package/react-google-login 在 React 前端轻松设置了 google 登录。这应该是您需要采取的第一步。

之后,您需要使用 django_allauth 在 Django 后端设置社交登录。基本上,这个想法是,一旦用户通过谷歌登录,或者更准确地说,点击前端的“使用谷歌登录”按钮,就会从谷歌检索谷歌 access_token 并与一些其他数据一起保存在本地存储中。这里只有 access_token 感兴趣。因此,您需要获取此 access_token 并通过您将设置的视图的 Rest API 将其发送到 Django 后端。这将获取保存在社交帐户下数据库中的谷歌用户数据,最终将它们登录到应用程序中。从那时起,一切都应该按照您使用电子邮件和用户名的正常登录继续。也就是说,如果使用 JWT,将从后端返回一个 jwt 令牌,您希望能够将其保存在本地存储中。在我的 React 应用程序中,我根据此令牌进行身份验证,因此只要我在本地存储中拥有该令牌,用户就会登录。

Pratik Singh Chauhan 在他的第 1 部分教程中对此做了很好的解释 -> https://medium.com/@pratique/social-login-with-react-and-django-i-c380fe8982e2 和第 2 部分在这里-> https://medium.com/@pratique/social-login-with-react-and-django-ii-39b8aa20cd27


更新: 2022 年 6 月

由于 Google 现在正在转向 (GIS) Google Identity Services 登录 SDK,因此这种方法虽然有效,但现已弃用。

这里有一个很好的链接,可以帮助您使用新的 google GIS 设置 React 登录。

https://github.com/MomenSherif/react-oauth/issues/12#issuecomment-1131408898

根据您的工作流程,您可以使用两种方法:隐式或授权。为了保持与上述代码实现的类似工作流程,隐式工作流程可以为您提供 access_token 和 refresh_token,并将其发送到后端 api。

这是另一个链接,其中包含两个工作流程的示例代码。

https://react-oauth.vercel.app/

请注意,您需要使用 @react-oauth/google 在代码中配置 Google 工作流程。

参考这个:

https://reactjsexample.com/google-oauth2-using-the-new-google-identity-services-sdk-for-react/


0
投票

嗨,我想你需要的是来自谷歌的这篇超级有用的文章 关于如何实施的谷歌教程 基本上只需将 google-api-python-client 添加到您的requirements.txt中 其余的很简单 你甚至不需要下载 jwtpython

那么会发生什么 请求是否到达 django 后端

google 解码 jwt 并确保对其进行验证,否则会出现错误

比你得到用户信息的['sub'],即google id

因此向您的用户模型添加一个 charfield(因为数字对于 bigInt 来说太大了)

现在,当用户进来时,您可以像平常一样添加他的电子邮件,并添加他的姓名等,但是您将密码设置为空白字符串,这是安全的,因为在 django 中,散列密码“”与原始密码不同密码“”,这样就没有人可以登录该帐户(但如果您只想阻止使用默认登录名登录到拥有 googleid 的人)

将 google id 添加到用户字段(对于非 google 用户,将其保留为空)

如果 google id 已经存在,您可以登录该用户而不是注册他

这是我如何在我的mug项目中设置它(顺便说一句,如果你想访问我上面的杯子存储库链接中的 /frontend/myauth/views.py 中的特定文件)

class GoogleAuth(APIView):
def post(self, request):
    data = request.data
    token = data.get('credential')
    try:
        idinfo = id_token.verify_oauth2_token(token, google_requests.Request(), google_client_id)

        if not (idinfo["aud"] == google_client_id == data.get("clientId")):
            raise ValidationError("Invalid client ID.")
    except:
        # Invalid token
        return Response({"status": "invalid token"}, status=400)
    else:
        userid = str(idinfo['sub'])
        email = idinfo.get('email')
        name = idinfo.get("name")
        google_users_group, created = Group.objects.get_or_create(name="google_users")


        user = google_users_group.user_set.filter(google_id=userid)
        user_exists = user.exists()
        if user_exists:# login account
            user = user.first()
        else: # create account
            username = random_username_from_name(name)
            user = User.objects.create_user(username=username, email=email, name=name, password="",
                                            groups=[google_users_group], hash=False, google_id=userid)
            picture_url = idinfo.get("picture", None)
            if picture_url is not None:
                add_image_from_url(user, "avatar", picture_url)
        return return_user_data(user)

总之很简单 我希望我能减轻任何其他新人在试图解决这个问题时的头痛,我花了几个月的时间才找到那篇金色的谷歌文章

显然我不会进入前端,因为它是小菜一碟 你所需要的就是这个@react-oauth/google,它有很好的文档记录,并且允许漂亮的一键注册/登录 在此输入链接描述

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