繁体   English   中英

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

[英]Did anyone manage to get the id token from google sign in (Flutter)

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

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

ps:没有使用firebase,只能google登录。

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

你可以尝试使用这个

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

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

正如文档指出的那样,您需要后端的 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>

您可以像这样更简单地获取访问令牌和 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);
}

检索 Is idToken 为我工作:

1google-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

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

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

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

实现此目的的另一种更简洁的方法:

late Map<String, dynamic> userObject = {};
var res = await _googleSignIn.signIn();
var googleKey = await res!.authentication;
userObject.addAll({
  'accessToken': googleKey.accessToken,
  'idToken': googleKey.idToken,
  'displayName': res.displayName ?? '',
  'email': res.email,
  'id': res.id,
  'avatarUrl': res.photoUrl ?? '',
  'serverAuthCode': res.serverAuthCode ?? '',
});

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

尝试在没有 google-services.json 的情况下实现此功能时,我的令牌值为空,但成功登录谷歌。

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

  • 在谷歌云控制台中,注册您的应用程序。
  • 然后确保您“在”您刚刚在顶部下拉菜单中创建的应用程序。
  • 在侧边栏菜单的“api 和服务”中,通过创建 Oauth 同意屏幕菜单,我不记得必须填写很多字段,所以如果您不知道要输入什么,请将它们留空。
  • 然后转到侧边栏中的“凭据”菜单,单击“创建新凭据”,然后选择 OAuth2 客户端 ID。 制作一个 Web 客户端,即使您尝试将它与 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,此步骤会自动为您完成。 在这种情况下,您必须为您的 Android 设备创建一个 Web 客户端和一个。 在生产中,您将为您的生产应用程序使用特定的客户端。

我相信应该这样做,可能错过了一步。

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

我仍然在努力让它与 ios 一起使用,但 android 端效果很好。

尝试这个:

当您创建 GoogleSignIn object 时:

GoogleSignIn(clientId: "你的客户 ID")

我希望它有帮助;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM