mit*_*out 5 google-signin flutter
我正在使用google_sign_in包将Google Sign In集成到我的 flutter 应用程序中,我注意到用户登录后,您可以看到显示名称,但看不到名字和姓氏:
final GoogleSignInAccount googleSignInAccount =
await googleSignIn.signIn();
final name = googleSignInAccount.displayName; // exists
final firstName = googleSignInAccount.givenName; // does not exist
final lastName = googleSignInAccount.familyName; // does not exist
Run Code Online (Sandbox Code Playgroud)
我还注意到, Google Sign In的 Android 和 iOS 库确实包含givenName和familyName字段,但由于某种原因,它被排除在 flutter 库之外。
我错过了什么吗?有没有办法使用额外的 api 调用来检索这些字段?
注意:请不要回复说仅通过 将显示名称分成几部分 googleSignInAccount.displayName.split(" ");。这不是解决方案,因为显示名称并不总是用户的全名,或者显示名称可能超过 2 个单词。
我发现这些值可以从下面的身份验证步骤中检索到的 id 令牌中提取:
final GoogleSignInAuthentication googleSignInAuthentication = await googleSignInAccount.authentication;
final idToken = googleSignInAuthentication.idToken;
Run Code Online (Sandbox Code Playgroud)
创建一个将 JWT 令牌解析为 Map 的方法:
static Map<String, dynamic> parseJwt(String token) {
// validate token
if (token == null) return null;
final List<String> parts = token.split('.');
if (parts.length != 3) {
return null;
}
// retrieve token payload
final String payload = parts[1];
final String normalized = base64Url.normalize(payload);
final String resp = utf8.decode(base64Url.decode(normalized));
// convert to Map
final payloadMap = json.decode(resp);
if (payloadMap is! Map<String, dynamic>) {
return null;
}
return payloadMap;
}
Run Code Online (Sandbox Code Playgroud)
从这里,可以轻松检索given_name和:family_name
Map<String, dynamic> idMap = parseJwt(idToken);
final String firstName = idMap["given_name"];
final String lastName = idMap["family_name"];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1802 次 |
| 最近记录: |