6

Eksperymentuję z Cognito i kiedy wydawało mi się, że zaczyna być OK, mam do czynienia z problemem tokena (Google), który wygasa po 1 godzinie.AWS Cognito: zajmowanie się czasem wygaśnięcia tokena

Po uruchomieniu z czystym urządzeniem mogę się zarejestrować, korzystać z aplikacji przez 1 godzinę, a gdy tylko będę potrzebował odświeżyć zestaw danych, otrzymam komunikat o błędzie z informacją, że token nie jest autoryzowany.

Czy istnieje przykład, jak sobie z tym poradzić?

Czy to naprawdę coś, co powinni robić programiści aplikacji? Spodziewałem się, że SDK będzie zarządzał takimi rzeczami w tle.

Czy to oznacza, że ​​musimy sprawdzić credentialsProvider.getSessionCredentitalsExpiration() przed każdą synchronizacją datasetu?

Dziękujemy, JM

Edit 1: Dodano kod

Mam SigninActivity, ale nazywa się to tylko wtedy, gdy nie ma poświadczenia w ogóle istnieje teoretycznie dopiero po raz pierwszy użytkownik loguje się.

Jest zbudowany w następujący sposób (usunięte bezużyteczne bity). Co się dzieje, to to, że uwierzytelniam się poprawnie za pierwszym razem, ale ponieważ nigdy więcej nie wchodzę w to działanie, może czegoś brakuje.

Ale musi być sposób na odświeżenie tego tokenu w trybie cichym?

@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); 
    } 
} 

Odpowiedz

0

Czy wykonujesz wszystkie czynności opisane w dokumencie here? Pakiet SDK automatycznie dostarczy dane uwierzytelniające AWS w zamian za prawidłowy token, ale jeśli Twój token Google wygasł, musisz go odświeżyć.

+0

Cześć Rachit, dziękuję za odpowiedź, zredagowałem moje pytanie i dodałem mój kod. Ogólnie rzecz biorąc, przykłady na to, jak obsługiwać odświeżanie tokena i grzecznie "po znaku na błędach" (użytkownik cofnął auth, tego typu rzeczy) naprawdę by pomogły. – jmc34

+0

Odświeżenie tokena google jest upto osobiste i widzieliśmy, jak programiści robią coś podobnego do http://stackoverflow.com/questions/18572088/how-to-get-oauth-2-refresh-token-using-access -znak. Powiedzmy, że słyszeliśmy prośby klientów o dostarczanie metod pomocniczych do odświeżania tokenów i rozważymy dodanie ich w przyszłych wydaniach. –

+0

Rachit, mogę tylko uzupełnić to wymaganie. Nie mam zamiaru iść na ciebie, ale to jest bardzo rozczarowujące, że nie jest to możliwe po wyjęciu z pudełka. Jeśli nie jestem zdezorientowany, brzmi to jak całkiem podstawowy wymóg, a SDK powinien zajmować się różnymi rzeczami, abyśmy mogli skupić się na naszej wartości dodanej. – jmc34

Powiązane problemy