2 votes

Obtenir le jeton Google Refresh à partir du code d'authentification de l'utilisateur existant

J'essaie d'obtenir le jeton de rafraîchissement de Google, le truc c'est que je n'ai vu mon scénario actuel nulle part, ce que j'essaie d'accomplir est d'obtenir le jeton de rafraîchissement à partir d'un jeton d'authentification de l'utilisateur déjà généré par une signature google à partir d'une application Android native, En gros, je demande toutes les autorisations de Google dont j'ai besoin sur l'application, et le code d'authentification de la connexion, avec ce code d'authentification, je l'envoie à mon backend de fonctions Firebase, là j'essaie d'obtenir le jeton de rafraîchissement, mais je reçois toujours invalid_grant de Google, donc je ne sais pas où je peux me tromper.

J'ai vu que la demande d'oauth hors ligne pourrait résoudre le problème, mais je suis connecté dans l'application Android, donc je ne peux pas faire une demande de connexion hors ligne à partir du backend, j'ai besoin que la connexion et l'authentification soient uniquement sur l'application Android et j'en ai besoin pour faire des demandes d'assistant Google sur le backend et pour cela, la seule chose qui manque est le jeton de rafraîchissement.

J'ai ma clé google oauth2 de la console google cloud et le client s'est initialisé.

var OAuth2 = google.auth.OAuth2;

var _client_id = require('./config/secrets/omni.json').installed.client_id; 
var _client_secret = require('./config/secrets/omni.json').installed.client_secret;
var redirect = require('./config/secrets/omni.json').installed.redirect_uris[1];

return new OAuth2(
        _client_id,
        _client_secret,
        redirect
        );

Et enfin essayer d'obtenir le jeton :

function getRefreshToken(authCode, idFBUser) {
    return new Promise((resolve, reject) => {
        getOAuthClient().getToken(authCode, function(err, token) {
            if (!err) {
                console.log(`Get Token success, token: ${token}`);
                getOAuthClient().setCredentials(token);
                saveRefreshFirebase(idFBUser, token)
                resolve(token);
            } else {
                console.log("Get Token error", err);
                reject(err);
            }
        });
    });
}

L'erreur que j'obtiens exactement est celle-ci : { error : 'invalid_grant', error_description : 'Bad Request' }

La méthode que j'utilise dans l'application Android pour demander le code d'authentification est la suivante :

Création de l'instance GoogleSignIn

val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .requestId()
            .requestIdToken(getClientId())
            .requestServerAuthCode(getClientId())
            .requestScopes(ASSISTANT_SCOPE)
            .build()

googleSignInClient = GoogleSignIn.getClient(this, gso)

Appeler le signe dans l'intention :

val signInIntent = googleSignInClient.signInIntent
startActivityForResult(signInIntent, RESULT_GOOGLE_SIGNIN)

Traiter le résultat de la signature :

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == Activity.RESULT_OK) {
            when (requestCode) {
                RESULT_GOOGLE_SIGNIN -> {
                    val task = GoogleSignIn.getSignedInAccountFromIntent(data)
                    try {
                        task.result?.let {  account ->
                            val id = account.id
                            val idToken = account.idToken
                            val authCode = account.serverAuthCode
                            Log.d("GoogleSignIn", "ID: $id")
                            Log.d("GoogleSignIn", "ID Token: $idToken")
                            Log.d("GoogleSignIn", "Auth code: $authCode")
                            btnLogin.text = "Sign Out"
                            loggedIn = true
                        } ?: Log.e("GoogleSignIn", "Exception: ${task.exception}")
                    } catch (e: Exception) {
                        Log.e("GoogleSignIn", "Catch Exception: $e")
                    }
                }
            }
        }
    }

et le authCode est celui que j'ai utilisé pour essayer d'obtenir le jeton de rafraîchissement dans le backend.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X