有没有人设法从谷歌登录 (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 中应添加此标记:检索 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 令牌的主要内容,如果未能解决你的问题,请参考以下文章