有没有人设法从谷歌登录 (Flutter) 获取 id 令牌

Posted

技术标签:

【中文标题】有没有人设法从谷歌登录 (Flutter) 获取 id 令牌【英文标题】:Did anyone manage to get the id token from google sign in (Flutter) 【发布时间】:2019-02-26 18:19:05 【问题描述】:

我正在尝试将我的用户与我的后端服务器连接起来,我使用了官方谷歌登录插件中的示例来进行颤振: https://pub.dartlang.org/packages/google_sign_in

签名过程顺利,我得到了用户名和电子邮件等.. 但我需要 id 令牌来通过我的服务器对用户进行身份验证。

Ps:不使用 firebase ,只用 google 登录。

谁能指导我如何获得 id 令牌?

【问题讨论】:

【参考方案1】:

你可以试试这个

 _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');
      );

【讨论】:

谢谢你,我会试试,让你知道:) 完美运行,非常感谢:) 奇怪,我只是用这个方法得到了null for idToken @MattR 我曾经遇到过同样的问题。你可以查看这个 github 问题,看看它是否有帮助。 github.com/flutter/flutter/issues/12140 @maheshmnj 您可以使用https://www.googleapis.com/oauth2/v3/tokeninfo?<id_token or access_token>=<token>检查令牌是否有效【参考方案2】:

您可以像这样更简单地获取访问令牌和 id 令牌:

final result = await _googleSignIn.signIn();
final ggAuth = await result.authentication;
print(ggAuth.idToken);
print(ggAuth.accessToken);

或者您也可以将其添加到 try-catch 以处理错误。

try 
   final result = await _googleSignIn.signIn();
   final ggAuth = await result.authentication;
   print(ggAuth.idToken);
   print(ggAuth.accessToken);
 catch (error) 
  print(error);

【讨论】:

【参考方案3】:

如果 id 令牌为空,或者尝试这样,它对我有用。

正如docs 指出的那样,您需要后端的 oauth2 客户端 ID 来请求 idToken 或 serverAuthCode。

在身份验证中从 firebase google sigin 复制 Web SDK 配置 将以下粘贴添加到 res/values/strings.xml,应该可以工作

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="default_web_client_id">Web app Client id goes here</string>
</resources>

【讨论】:

这对我有用!我没有在我的项目中添加任何 firebase 依赖项......它有效! 是的,不需要 firebase 依赖,但您需要使用一些谷歌库在后端验证 id 令牌 我没有 strings.xml 文件我应该创建它吗? @fethi 是的,你需要创建 @giveJob 我找到了。在 ios firebase 文件的 GoogleService-info.plist 中应添加此标记:SERVER_CLIENT_IDMY_WEB_ID.apps.googleusercontent.com【参考方案4】:

检索 Is idToken 为我工作:

1.google-services.json文件必须放在/android/app/

2.你需要添加到你的/android/app/build.gradle

apply plugin: 'com.google.gms.google-services'

3. 和 /android/build.gradle

classpath 'com.google.gms:google-services:4.3.4'

就是这样。 GoogleSignIn 将返回一个真实的 idToken 而不是 null。

字体:https://github.com/flutter/flutter/issues/12140#issuecomment-348720774

【讨论】:

【参考方案5】:

我在这个问题上苦苦挣扎了大约一个月。事实证明,即使用户尝试重新启动应用程序,我也获得了相同的访问令牌。这很痛苦,因为我的应用程序处理范围,如果用户在第一次登录时错过检查一个或多个范围,应用程序根本无法工作,即使他/她再次登录并授予权限。

对我有用的解决方法:我调用了googleSignIn.currentUser.clearAuthCache() 方法,然后调用了googleSignIn.signInSilently()。这将返回一个可用于进一步身份验证的 GoogleSignInAccount。我的猜测是 clearAuthCache() 方法清除了令牌缓存,因此创建了一个新令牌。这应该会为您提供一个新的访问令牌并让您的应用进行有效调用。

我诚恳地请求 Google 开发者解决这个问题。目前,这种解决方法是唯一有效的方法。

【讨论】:

以上是关于有没有人设法从谷歌登录 (Flutter) 获取 id 令牌的主要内容,如果未能解决你的问题,请参考以下文章

Flutter从谷歌地图获取坐标

从谷歌地图获取多边形

如何在颤振中从谷歌地图获取位置的经纬度坐标?

如何从谷歌 api 令牌中获取数据?

Flutter - 从谷歌地图小部件中删除标记

fullcalendar 没有从谷歌日历获取事件