Получение списка Google Фото вернуло 401 без проверки подлинности - PullRequest
0 голосов
/ 22 января 2020

Я работаю над приложением, которое может отображать изображения из Google Фото.

Проблема

Проблема возникла, когда пользователь вручную отозвал мое приложение внутри Gmail Разрешение . После того, как пользователь сделает это (отозвать разрешение), снова откройте приложение, и когда приложение пытается получить доступ к списку изображений из Google Фото, это ошибка, которую я получил в JSON.

{
  "error": {
    "code": 401,
    "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "status": "UNAUTHENTICATED"
  }
}

После этого я выхожу из Google Sign In и отменяю его. Я снова вхожу, появилось всплывающее окно для выбора учетной записи Gmail, но всплывающее окно с разрешением для приложения «Грант» не появилось. Он должен отображаться так, чтобы приложение могло снова запросить у пользователя разрешение.

Предоставить всплывающее окно разрешения приложения. enter image description here

Вот как я могу войти в Google Войти

val googleSignInOptions =
    GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestScopes(Scope("https://www.googleapis.com/auth/photoslibrary.readonly"))
        .requestEmail()
        .build()
val googleSignInClient = GoogleSignIn.getClient(context, googleSignInOptions!!)

Вот как я могу выйти и отозвать код

googleSignInClient?.signOut()
    ?.addOnCompleteListener {
        //Sign Out Complete
        googleSignInClient?.revokeAccess()?.addOnCompleteListener {
            //Revoke Complete
        }
    }

Мои наблюдения

  1. Несмотря на то, что разрешение на странице Разрешение Gmail уже отозвано, GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(context), Scope(GOOGLE_PHOTOS_READ_SCOPE)) все еще возвращает значение true. По логике он должен возвращать false, потому что пользователь уже отозвал разрешение.
  2. Даже если приложение уже выходит из системы Google Sign In, при повторном входе в систему пользователь получит тот же токен доступа, что и предыдущий предоставленный. что срок действия истекает в течение 1 часа.

Конец дня, я хотел бы иметь возможность показывать всплывающее окно разрешения приложения, даже если пользователь вручную отозвал разрешение. Спасибо.

1 Ответ

0 голосов
/ 24 января 2020

Я нашел решение этой проблемы.

При выходе из системы мне нужно очистить токен, вызвав эту функцию в потоке.

GoogleAuthUtil.clearToken(
    context,
    token
)

В целом, вот как Я выхожу.

googleSignInClient.signOut()
    .addOnCompleteListener {
        if (it.isSuccessful) {
            thread {
                GoogleAuthUtil.clearToken(
                    context,
                    token
                )
                googleSignInClient.revokeAccess()
            }
        }
        callBack(it.isSuccessful)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...