fetchAccountDetails method

Future<GoogleAccountDetails> fetchAccountDetails(
  1. Session session, {
  2. required String idToken,
  3. required String? accessToken,
})

Returns the account details for the given accessToken.

Implementation

Future<GoogleAccountDetails> fetchAccountDetails(
  final Session session, {
  required final String idToken,
  required final String? accessToken,
}) async {
  final String clientId = config.clientSecret.clientId;

  Map<String, dynamic> data;
  try {
    data = await IdTokenVerifier.verifyOAuth2Token(
      idToken,
      config: const GoogleIdTokenConfig(),
      audience: clientId,
    );
  } catch (e) {
    session.logAndThrow('Failed to verify ID token from Google');
  }

  if (accessToken != null) {
    final response = await http.get(
      Uri.https('www.googleapis.com', '/oauth2/v3/userinfo'),
      headers: {'Authorization': 'Bearer $accessToken'},
    );

    if (response.statusCode != 200) {
      session.logAndThrow('Failed to get user info from Google');
    }

    data = jsonDecode(response.body);
  }

  GoogleAccountDetails details;
  try {
    details = _parseAccountDetails(data);
  } catch (e) {
    session.logAndThrow('Invalid user info from Google: $e');
  }

  try {
    final getExtraInfoCallback = config.getExtraGoogleInfoCallback;
    if (accessToken != null && getExtraInfoCallback != null) {
      await getExtraInfoCallback(
        session,
        accountDetails: details,
        accessToken: accessToken,
        transaction: null,
      );
    }
  } catch (e) {
    session.logAndThrow('Failed to get extra Google account info: $e');
  }

  return details;
}