¿Cómo obtener idToken de la API de Expo GoogleSignIn (expo v32)?

4

Estoy tratando de configurar la autenticación nativa de Google en react-native usando la API de Expo GoogleSignIn , pero no puedo obtener idToken para el usuario autorizado de Google.

Tiene accessToken en respuesta, pero no idToken.

Entonces estoy usando un código directo como

const result = await GoogleSignIn.initAsync({
                isOfflineEnabled: true,
                isPromptEnabled: true,
                //webClientId: 'webClientId',
                clientId // now testing only on Android, so this is irrelevant
                });
console.log(result);

Respuesta de ejemplo:

 Object {
    "auth": Object {
      "accessToken": "accessToken",
      "accessTokenExpirationDate": null,
      "idToken": null,  // here is the problem!
      "refreshToken": null,
    },
    "displayName": "Danila Tsvetkov",
    "email": "[email protected]",
    "firstName": "Danila",
    "hostedDomain": undefined,
    "lastName": "Tsvetkov",
    "serverAuthCode": null,
    "uid": "uid",
  }

Al mismo tiempo, la API de Google OAuth devuelve no solo accessToken, sino también idToken y refreshToken.

Todo lo demás funciona bien, como la autorización y el flujo de inicio de sesión.

¿Quizás el problema está en serverAuthCode?

Intenté poner webClientId, api deja de funcionar correctamente. Se agregó SHA1 a los servicios de Google ( más información ), no ayudó. Cambiar otros parámetros como "isOfflineEnabled" tampoco hace mucho.

0

¿Puedes usar esto?

const result = await Google.logInAsync({
          androidClientId: "android id"
          iosClientId: 'Ios Id',
          scopes: ['profile', 'email'],
        });

luego

 if (result.type === 'success') {
          console.log(result.idToken);
//or
          Alert.alert(result.idToken);
        }
0

if (result.type === 'success') {
     console.log(result.user.auth);
}

esto se debe a que usamos el inicio de sesión de Google, en lugar de expo-google-app-auth

así que en conclusión, use result.user.auth, pero antes de eso, su código debería verse así

signInAsync = async () => {
    try {
      await GoogleSignIn.askForPlayServicesAsync();
      const result = await GoogleSignIn.signInAsync();
      if (result.type === 'success') {
        
        this.onSignIn(result.user.auth);
        return result.user.auth;
      }
    } catch ({ message }) {
      alert('login: Error:' + message);
    }
  };