Включает ли пакет Flutter google_sign_in способ получения имени и фамилии пользователя? - PullRequest
1 голос
/ 20 апреля 2020

Я интегрирую Google Sign In в мое приложение флаттера, используя пакет google_sign_in , и я замечаю, что как только пользователь входит в систему, вы можете видеть отображаемое имя, но не имя и фамилия:

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

Я также заметил, что библиотеки Android и iOS для Вход в Google включают поля givenName и familyName , но по какой-то причине он исключен из библиотеки флаттера.

Я что-то упустил? Есть ли способ получить эти поля, используя дополнительный вызов API?

Примечание: Пожалуйста, не отвечайте, говоря просто разделить отображаемое имя на части с помощью googleSignInAccount.displayName.split(" ");. Это не решение, поскольку отображаемое имя не всегда является полным именем пользователя или отображаемое имя может содержать более 2 слов.

1 Ответ

0 голосов
/ 21 апреля 2020

Я обнаружил, что эти значения можно извлечь из токена id, полученного на шаге аутентификации ниже:

final GoogleSignInAuthentication googleSignInAuthentication = await googleSignInAccount.authentication;
final idToken = googleSignInAuthentication.idToken;

Создать метод парсинга токена JWT в карту:

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;
}

Отсюда given_name и family_name легко доступны:

Map<String, dynamic> idMap = parseJwt(idToken);

final String firstName = idMap["given_name"];
final String lastName = idMap["family_name"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...