signinwithpopup - googlesigninoptions android example
El nombre de usuario de Google obtiene token de acceso con nuevas GoogleSignInOptions (2)
Mi aplicación de Android actualmente usa GoogleAuthUtil para iniciar sesión en los usuarios y recuperar un access_token
que se pasa al backend (fragmentos de código debajo de los cuales se muestra la creación de GoogleApiClient y el uso de GoogleAuthUtil para obtener el token).
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API)
.addScope(new Scope("profile"))
.build();
...
...
String accessToken = GoogleAuthUtil.getToken(GoogleLoginActivity.this,
Plus.AccountApi.getAccountName(mGoogleApiClient),
"oauth2:profile email");
que luego envié al back-end
Ahora estoy intentando pasar al nuevo inicio de sesión de Google: https://developers.google.com/identity/sign-in/android/sign-in
y así cambió la creación de GoogleApiClient como,
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken("<web client id>")
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
y luego para hacer el uso de inicio de sesión,
startActivityForResult(Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient), RC_GET_TOKEN);
y en el uso del resultado de la actividad (similar al ejemplo en el enlace anterior),
OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
if (opr.isDone()) {
// If the user''s cached credentials are valid, the OptionalPendingResult will be "done"
// and the GoogleSignInResult will be available instantly.
Log.d(TAG, "Got cached sign-in");
handleSignInResult(opr.get());
} else {
// If the user has not previously signed in on this device or the sign-in has expired,
// this asynchronous branch will attempt to sign in the user silently. Cross-device
// single sign-on will occur in this branch.
showProgress();
opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
@Override
public void onResult(GoogleSignInResult googleSignInResult) {
hideProgress();
handleSignInResult(googleSignInResult);
}
});
}
pero ahora parece que en handleSingInResult(GoogleSignInResult result)
solo puedo obtener un id token
con result.getSignInAccount().getIdToken();
¿Alguien sabe si es posible obtener un token de acceso de esto (como anteriormente) y, en caso afirmativo, cómo? Cualquier ayuda apreciada.
Después de iniciar sesión, podrás obtener el token:
final String token = GoogleAuthUtil.getToken(mAppContext, mAccountName, AUTH_TOKEN_TYPE);
no te olvides de hacerlo una Asynctask. para más detalles eche un vistazo a aquí
EDITAR:
Tenga en cuenta que, a pesar del nombre del método:
GoogleAuthUtil.getToken()
no le proporciona un Token OAuth, sino que devuelve un "código de autorización de corta duración" de acuerdo con la documentación .
¿Qué debo hacer después de obtener el Código de autorización llamando a GoogleAuthUtil.getToken ()?
Debe transmitir el Código de autorización a su servidor back-end a través de HTTPS. Solo desde su servidor debe intentar recibir el token de Acceso y / o Actualización, no en su aplicación.
Entonces estaba teniendo el mismo problema. lo han cambiado ahora para que el token aparezca en
GoogleSignInAccount acct = result.getSignInAccount();
Log.d(TAG, "handleSignInResult2: "+acct.getIdToken());
Para acceder también a este token, también lo has solicitado en
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail().requestProfile().requestId().requestIdToken(getString(R.string.server_client_ID))
.build();
R.string.server_client_ID
es la client ID
del proyecto que usted hace en su Consola de desarrollador de Google.
Espero que esto te ayude.
aquí también está la documentación que seguí. https://developers.google.com/identity/sign-in/android/backend-auth