według https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInApi.html#constant-summaryGoogle zawsze zwraca wygasło znacznik ID (JWT)
Jeśli używasz czasu wygaśnięcia ID tokena do określenia żywotności sesji, należy pobrać odświeżony ID tokena, wywołując silentSignIn przed każdym API zadzwoń do serwera aplikacji.
Próbuję uzyskać nowy token, dzwoniąc silentSignIn. Ale zawsze otrzymuję token, który wygasł. Czy ktoś może mi pomóc w wskazaniu odpowiedniej dokumentacji, która pokazuje, jak wymusić odświeżenie, aby uzyskać nowy token. Mój kod to nic specjalnego. To prawie to samo, co mamy w próbce google.
private void buildGoogleApiClient()
{
// Configure sign-in to request the user's ID, email address, and basic profile. ID and
// basic profile are included in DEFAULT_SIGN_IN.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
//.requestServerAuthCode(serverClientId)
.requestIdToken(SERVER_ID)
.requestScopes(new Scope(Scopes.PLUS_LOGIN))
.requestEmail()
.build();
// Build a GoogleApiClient with access to GoogleSignIn.API and the options above.
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
}
buduję moje API jak powyżej, a gdy użytkownik kliknie logowania z przycisku Google I wykonać
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.
Timber.d("Got cached sign-in");
GoogleSignInResult result = opr.get();
handleSignInResult(result);
}
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.
Timber.d("Checking if user has already given access to this app on an other device.");
showProgressDialog();
opr.setResultCallback(new ResultCallback<GoogleSignInResult>()
{
@Override
public void onResult(GoogleSignInResult googleSignInResult)
{
hideProgressDialog();
handleSignInResult(googleSignInResult);
}
});
}
metodę handleSignInResult następujące działania dostanie token id jako
GoogleSignInAccount acct = result.getSignInAccount();
String idToken = acct.getIdToken();
Timber.d(acct.getIdToken());
EDIT 1
Mam ano term podobne pytanie.
Po tym, jak cofnąłem pozwolenie od https://security.google.com/settings/u/1/security/permissions, wciąż byłem w stanie odzyskać token ID (JWT). Załóżmy, że token jest zapisany w pamięci podręcznej, a usługi odtwarzania systemu Android dostarczają je z kopii lokalnej. Po wygaśnięciu usługi tokena (60 minut), skontaktuj się z serwisem Google, aby uzyskać najnowszy status. Ale nie widzę tego. Inną dziwną rzeczą, którą zauważyłem, jest to, że po wywołaniu funkcji silentSignIn() po upływie około jednego dnia otrzymuję nowy token za zgodą użytkownika. Czy ktoś może przetestować ten przypadek użycia i daj mi znać wynik.
W jaki sposób mogę się upewnić, że użytkownik jest proszony o ponowne udzielenie pozwolenia po ich odwołaniu.
Nie jestem do końca pewien, jak działa OptionalPendingResult, ale czy wypróbowałeś tutaj przewodnik? https://developers.google.com/identity/sign-in/android/sign-in#start_the_sign-in_flow (aktualne od 17 maja 2016 r.). Ten przewodnik używa 'startActivityForResult()' i 'onActivityResult()', w ten sposób zaimplementowałem mój i pobiera nie wygasły token. – Vinnie
Och! Zapomniałem dodać część startActivityForResult(). Próbowałem także z tym. ale nie było żadnych zmian w wyniku. Jak otrzymałeś token, który nie wygasł? google daje tylko 1-godzinny token. czy zdekodowałeś JWT z czymś podobnym do https://jwt.io/? jaka jest wartość epoki "exp"? –
Użyłem opisanego tutaj punktu końcowego tokena Google. https://developers.google.com/identity/sign-in/android/backend-authPiszę to jako rozwiązanie. – Vinnie