Flutter 的 google_sign_in 包是否包含检索用户名字和姓氏的方法?

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 库确实包含givenNamefamilyName字段,但由于某种原因,它被排除在 flutter 库之外。

我错过了什么吗?有没有办法使用额外的 api 调用来检索这些字段?

注意:请不要回复说仅通过 将显示名称分成几部分 googleSignInAccount.displayName.split(" ");。这不是解决方案,因为显示名称并不总是用户的全名,或者显示名称可能超过 2 个单词。

mit*_*out 7

我发现这些值可以从下面的身份验证步骤中检索到的 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)

  • 这有效。为什么这些信息就不能正常公开呢? (4认同)