Sto sperimentando con Cognito e quando ho pensato che stia iniziando a essere OK, sto affrontando il problema del token (Google) che scade dopo 1 ora.AWS Cognito: gestione del tempo di scadenza del token
Quando inizio con un dispositivo pulito, posso registrarmi, utilizzare l'app per 1 ora, quindi non appena ho bisogno di aggiornare un set di dati, ottengo e errore dicendo che il token non è autorizzato.
C'è qualche esempio su come affrontare questo?
È davvero qualcosa che gli sviluppatori di app dovrebbero fare? Mi aspettavo che l'SDK gestisse tali cose in background.
Significa che dobbiamo controllare credentialsProvider.getSessionCredentitalsExpiration() prima di ogni sincronizzazione di set di dati?
Molte grazie, JM
Edit 1: Aggiunto codice
ho un SigninActivity, ma viene chiamato solo quando non ci sono le credenziali esiste affatto, in teoria solo una volta la prima volta la l'utente esegue il login.
È costruito come segue (rimosso bit inutili). Quindi, quello che succede è che mi autenticano bene la prima volta, ma non entrando mai più in questa attività, forse manca qualcosa.
Ma ci deve essere un modo per aggiornare questo token in silenzio?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.signin);
// Aws Credential provider
credentialsProvider = new CognitoCachingCredentialsProvider(
getApplicationContext(), // Context
getString(R.string.aws_identity_pool), // Identity Pool ID
Regions.EU_WEST_1 // Region
);
// Google connect
findViewById(R.id.signin_with_google_btn).setOnClickListener(this);
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestProfile()
.requestIdToken(getString(R.string.google_server_client_id))
.requestId()
.build();
// Build a GoogleApiClient with access to the Google Sign-In API and the
// options specified by gso.
googleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
SignInButton signInButton = (SignInButton) findViewById(R.id.signin_with_google_btn);
signInButton.setSize(SignInButton.SIZE_WIDE);
signInButton.setScopes(gso.getScopeArray());
signInButton.setColorScheme(SignInButton.COLOR_DARK);
}
@Override
public void onClick(View view) {
this.signinWithGoogle();
}
/**
* Triggers Google signin
*/
private void signinWithGoogle() {
Log.v(this, "Signing in with Google...");
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);
this.startActivityForResult(signInIntent, GOOGLE_SIGN_IN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == GOOGLE_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
this.handleGoogleSignInResult(result);
} else {
// Other stuff
}
}
/**
* Handle Google sign in result
*/
private void handleGoogleSignInResult(GoogleSignInResult result) {
if (result.isSuccess()) {
Log.v(this, "Successfully logged in with Google...");
GoogleSignInAccount acct = result.getSignInAccount();
Log.v(this, "Signed in as %s/%s (token %s)", acct.getDisplayName(), acct.getEmail(), acct.getIdToken());
Map<String, String> logins = new HashMap<>();
logins.put("accounts.google.com", acct.getIdToken());
Log.v(SigninActivity.this, "Google token <<<\n%s\n>>>", logins.get("accounts.google.com"));
credentialsProvider.setLogins(logins);
} else {
// Signed out
Log.w(this, "Failed to authenticate against Google #%d - %s", result.getStatus().getStatusCode(), result.getStatus().getStatusMessage());
SimpleMessageDialog.show(SigninActivity.this,
R.drawable.icon,
R.string.error,
R.string.sorry_error_signing_you_in_please_try_again,
R.string.try_again);
}
}
Ciao Rachit, grazie per la tua risposta, ho modificato la mia domanda e aggiunto il mio codice. In generale, un esempio su come gestire l'aggiornamento dei token e in modo gerarchico "post-sign-on-error" (l'utente ha revocato l'autenticazione, questo genere di cose) sarebbe davvero di grande aiuto. – jmc34
Quindi aggiornare il token di Google è una preferenza personale e abbiamo visto gli sviluppatori fare qualcosa sulla falsariga di http://stackoverflow.com/questions/18572088/how-to-get-oauth-2-refresh-token-using-access -gettone. Detto questo, abbiamo sentito le richieste dei clienti di fornire metodi di supporto per aggiornare i token e prenderemo in considerazione l'aggiunta di quelli nelle versioni future. –
Rachit, posso solo seguire questo requisito. Non ti sto provando, ma questo è abbastanza deludente che questo non sia gestito immediatamente. A meno che non sia confuso, questo sembra un requisito piuttosto basilare e l'SDK dovrebbe occuparsi di cose del genere per permetterci di concentrarci sul nostro valore aggiunto. – jmc34