首页 > 解决方案 > 如何在 Django 中借助 idToken 进行谷歌登录

问题描述

这是我用来在我的颤振应用程序中检索 idToken 的代码

  Future<void> _handleSignIn() async {
    try {
      final result = await _googleSignIn.signIn();
      final ggAuth = await result!.authentication;      
      print(ggAuth.idToken); // this is the one that I use as token value
      print(ggAuth.accessToken);      
    } catch (error) {
      print(error);
    }
  }

这是我用来访问后端用户信息的代码。

from google.oauth2 import id_token
from google.auth.transport import requests

try:
    idinfo = id_token.verify_oauth2_token(token, requests.Request(), CLIENT_ID)
    userid = idinfo['sub']
    print(userid)

except ValueError:
    print('Invalid token)

但是在将 token 变量替换为从 Flutter 应用程序接收到的令牌并将 CLIENT_ID 替换为为我的应用程序生成的 id(在控制台中可用)之后,它仍然会抛出无效令牌的错误。我究竟做错了什么?

编辑-当我使用https://jwt.io/解码令牌时,它按预期工作,我得到了所有详细信息。

标签: pythonfluttergoogle-oauth

解决方案


身份验证将 id 令牌视为您的出生证明。它只是将您识别为一个人。

授权将访问令牌视为您的驾驶执照,其中包含您必须驾驶汽车的权限。

Id 令牌不会写入允许您访问谷歌服务器上的任何数据。使用访问令牌,您已被授权访问某些数据(在这种情况下为某些配置文件信息)。

您遇到的问题是您正在使用登录。登录是 Open id connect 将其视为出生证明(Id 令牌)。有一个用户正在登录您的应用程序。他们在寻找他们的电脑。默认情况下,使用 Google 登录可以让您获得基本的个人资料信息。您对 Jwt.io 所做的是检查在 Id 令牌中返回的声明。Id 令牌只是允许您的应用程序识别用户已登录的令牌。还应该有一个子声明,您应该使用此 id 将用户映射到您的完整用户系统。声明中可能包含用户名和电子邮件地址,但您不能保证每次谷歌声明他们并不总是返回这些声明时它们都会出现。

要在用户登录后获取用户个人资料信息,您应该使用 people api 传递访问令牌时的 people.get 方法将返回给您当前经过身份验证的用户的个人资料信息。

除此之外,如果您希望在后端使用令牌,则 IMO 不应该将令牌传递给您的后端,您应该使用您的后端语言登录用户。


推荐阅读