这个问题可能非常简单,但我已经搜索了一段时间,但还没有找到确切的解决方案。
我正在尝试使用 React 作为前端,使用 Django 作为后端来实现 Google 登录。
我具体该怎么做?我见过一些解决方案,其中将令牌发送到后端,然后后端从 Google API 检索必要的信息,并根据令牌从数据库创建或检索用户。然而,这似乎是基于 JWT,我想知道是否可以使用简单的 Django Auth Token 来实现相同的功能?
也许我真的很盲目,但我真的找不到合适的解决方案。
感谢您的帮助!
在过去多次失败之后,我不久前实际上正在研究这个问题。试图找到一个适用于 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/
嗨,我想你需要的是来自谷歌的这篇超级有用的文章 关于如何实施的谷歌教程 基本上只需将 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,它有很好的文档记录,并且允许漂亮的一键注册/登录 在此输入链接描述