Около 2–4 дней назад наше приложение получило несколько отчетов от пользователей, которые используют вход с помощью учетной записи Google.
Проблема было:
- Когда пользователь впервые входит в систему в нашем приложении, нажимает кнопку «Войти через Google», затем отображается диалоговое окно от Google, в котором пользователь должен выбрать свою учетную запись для входа в систему. , после того, как пользователь выберет один, отобразится запрос на согласие пользователя. Пользователь должен согласиться с этим -> код работает нормально, может получать электронную почту пользователя.
- Однако, когда пользователь выходит из системы, а затем входит в систему с той же учетной записью, запрос на согласие пользователя не отображается. нет, и тогда наш код не сможет получить их электронную почту, но он вернет некоторый идентификатор строки, например "11231231231231231"
Код: следующий из https://developer.android.com/identity/ ... nager-siwg
GetSignInWithGoogleOption googleIdOption = new GetSignInWithGoogleOption.Builder(getString(R.string.your_web_client_id)).setNonce("nonce").build();
GetCredentialRequest request = new GetCredentialRequest.Builder().addCredentialOption(googleIdOption).build();
credentialManager.getCredentialAsync(this, request, new CancellationSignal(), Executors.newSingleThreadExecutor(), new CredentialManagerCallback() {
@Override
public void onResult(GetCredentialResponse result) {
handleSignIn(result);
}
@Override
public void onError(GetCredentialException e) {
Log.e(TAG, "Login Err" + e.getMessage());
}
});
public void handleSignIn(GetCredentialResponse result) {
Credential credential = result.getCredential();
if (credential instanceof CustomCredential) {
if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(credential.getType())) {
GoogleIdTokenCredential googleIdTokenCredential = null;
try {
googleIdTokenCredential = GoogleIdTokenCredential.createFrom(((CustomCredential) credential).getData());
} catch (Exception e) {
Log.e(TAG, "Received an invalid google id token response" + e.getMessage());
}
String personName = googleIdTokenCredential.getDisplayName();
String email = googleIdTokenCredential.getId();
}
}
}
После дополнительной отладки я заметил, что токен ответа также различается для первого пользователя и вернувшегося пользователя.
Первый пользователь
{
"iss": "https://accounts.google.com",
"azp": "....",
"aud": "....",
"sub": "105676566517108135791",
"email": "someemail@gmail.com",
"email_verified": true,
"nonce": "6f7492ed4cf77a82ad276b5d54f65e72",
"name": "some name",
"picture": "...",
"given_name": "Some",
"family_name": "Test",
"iat": 1726990428,
"exp": 1726994028
}
Возвращающийся пользователь
{
"iss": "https://accounts.google.com",
"azp": "....",
"aud": ".....",
"sub": "105676566517108135791",
"nonce": "some_nonce",
"iat": 1726990462,
"exp": 1726994062
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... a-on-retur
Мобильная версия