是否有人设法从Google登录中获取ID令牌(Flutter)

kag*_*ker 7 dart google-signin flutter

我正在尝试将我的用户连接到后端服务器,我使用了来自google官方登录插件的例子:https : //pub.dartlang.org/packages/google_sign_in

签名过程进行得很好,我得到了用户名和电子邮件等。但是我需要使用ID令牌才能通过我的服务器对用户进行身份验证。

附:不使用firebase,只有google登录。

谁能指导我如何获取ID令牌?

non*_*hto 18

您可以尝试使用此

 _googleSignIn.signIn().then((result){
          result.authentication.then((googleKey){
              print(googleKey.accessToken);
              print(googleKey.idToken);
              print(_googleSignIn.currentUser.displayName);
          }).catchError((err){
            print('inner error');
          });
      }).catchError((err){
          print('error occured');
      });
Run Code Online (Sandbox Code Playgroud)

  • @maheshmnj 您可以使用 `https://www.googleapis.com/oauth2/v3/tokeninfo?<id_token or access_token>=<token>` 检查令牌是否有效 (4认同)
  • 奇怪的是,我使用此方法只是为“idToken”获取“null” (2认同)

Ron*_*ing 8

该问题可能与不使用 firebase 有关。当您在 firebase 中注册应用程序时,会提供一个 google-services.json 文件,您可以将其与 google_sign_in 一起使用(这是文档中显示的默认方式)。

当我尝试在没有 google-services.json 的情况下实现此操作时,令牌值为 null,但成功登录到 google。

如果您不想使用 firebase,则必须跳过几个环节。

  • 在 Google Cloud Console 中,注册您的应用程序。
  • 然后确保您位于刚刚在顶部下拉菜单中创建的应用程序中。
  • 在侧边栏菜单的“api 和服务”中,浏览创建 Oauth 同意屏幕菜单,我不记得必须填写许多字段,因此如果您不知道要输入什么内容,请将它们留空。
  • 然后转到侧边栏中的“凭据”菜单,单击“创建新凭据”,然后选择 OAuth2 客户端 ID。创建一个网络客户端,即使您尝试将其与 android/ios 应用程序一起使用。
  • 制作一个文件android/app/src/main/res/values/strings.xml
  • 使用我们刚刚制作的 Web 客户端,插入<?xml version="1.0" encoding="utf-8"?> <resources> <string name="default_web_client_id">YOUR WEB CLIENT ID</string> </resources>strings.xml 文件。
  • [编辑] 在 Android 版 google 控制台中再创建一个客户端,并输入本地计算机的 sha1 密钥。如果您使用的是 firebase,此步骤会自动为您完成。在这种情况下,您必须创建 Web 客户端和适用于您的 Android 设备的客户端。在生产中,您将为生产应用程序使用特定的客户端。

我相信应该可以做到,可能错过了一步。

我还想在后端验证传入的 idtoken 是否有效,因此我还必须创建一个服务帐户(在 api 和服务 -> 凭据页面中)并在我的 go 服务器中使用它。

我仍然在努力让它在 ios 上工作,但 android 端工作得很好。


ica*_*ama 5

您可以更简单地获取访问令牌和 ID 令牌,如下所示:

final result = await _googleSignIn.signIn();
final ggAuth = await result.authentication;
print(ggAuth.idToken);
print(ggAuth.accessToken);
Run Code Online (Sandbox Code Playgroud)

或者你也可以将它添加到 try-catch 中来处理错误。

try {
   final result = await _googleSignIn.signIn();
   final ggAuth = await result.authentication;
   print(ggAuth.idToken);
   print(ggAuth.accessToken);
} catch (error) {
  print(error);
}
Run Code Online (Sandbox Code Playgroud)