2013-12-12 5 views
8

Когда я заставляю пользователя повторно авторизовать мое приложение во второй раз, используя approval_prompt=force, как я могу заставить Google показать пользователю весь список разрешений моего приложения? с просьбой?Повторная авторизация Google OAuth2 отсутствует на странице согласия

Детали:

У меня есть веб-приложение, которое запрашивает набор разрешений API Google, включая access_type=offline. В первый раз я одобряю его, он показывает правильную страницу согласия, с указанием всех разрешений, которая выглядит как:

first time Google OAuth2 consent page

Позже я отправить пользователя на авторизацию с помощью Google, с теми же параметрами. Второй раз, это только показывает «автономный доступ»:

enter image description here

Почему не показывать пользователям всех разрешений? Есть ли способ заставить его попросить пользователя обо всех разрешениях во второй раз? Почему теперь отображается «В автономном режиме» в первый раз?

Наши пользователи сбивают с толку, что наше приложение не запрашивает никаких реальных разрешений, поэтому я бы скорее просто повторил первый экран утверждения.

Полные параметры для запроса, который я делаю, следующие. URL:

https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&client_id=1039955146864.apps.googleusercontent.com&redirect_uri=http://localhost:8081/sync/google/callback&response_type=code&scope=openid%20email%20https://www.googleapis.com/auth/admin.directory.group.readonly%20https://www.googleapis.com/auth/admin.directory.group.member.readonly%20https://www.googleapis.com/auth/admin.directory.user.readonly&state=480704597031619284232891277399900450622 

Параметры разбиты:

access_type:offline 
approval_prompt:force 
client_id:1039955146864.apps.googleusercontent.com 
redirect_uri:http://localhost:8081/sync/google/callback 
response_type:code 
scope:openid email https://www.googleapis.com/auth/admin.directory.group.readonly https://www.googleapis.com/auth/admin.directory.group.member.readonly https://www.googleapis.com/auth/admin.directory.user.readonly 
state:480704597031619284232891277399900450622 
+0

У нас один и тот же вопрос. Вы что-то поняли? –

ответ

8

Мы запустили инкрементный аутентификации и это работает штатно.

http://googleplusplatform.blogspot.com/2013/12/google-sign-in-improvements11.html

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

Если вы правильно пишете заявку, эта ситуация не должна возникать. Если вы запросите офлайн-код (обновить токен) и сохраните его на своем сервере, вы не должны запрашивать его снова, если вам не нужны новые области/разрешения. Вы должны использовать токен обновления, который вы сохранили в будущем. Если вам нужен только токен доступа, когда пользователь находится на вашем сайте, вы можете использовать другие потоки для запроса токена доступа без просмотра страницы утверждения.

+0

Спасибо за объяснение. Кажется разумным, хотя и не то, что я ожидал с «approv_prpt = force» (думаю, я ожидал, что он снова попросит разрешения ALL). Я исправлю свое приложение, чтобы сделать что-то еще. –

+1

«Если вы правильно пишете свое приложение, эта ситуация не должна возникать» ... Как мы можем обрабатывать случай, когда мы получаем токен обновления, но затем имеем сбой, который предотвращает его сохранение? Мы вынуждены показывать пользователю путаное разрешение «иметь автономный доступ», когда мы снова пытаемся. –

+0

Да, это ситуация, когда нам нужно сделать лучше и показать более значимую страницу. Мы рассматриваем: а) снова покажем все области. B) покажите сообщение и попросите пользователя просто подтвердить учетную запись, которую они пытаются использовать для входа. например «Выберите учетную запись, которую вы хотите использовать для входа в это приложение». Это может позаботиться о ситуациях, когда пользователь подписывается на несколько учетных записей и может захотеть войти в систему с другой учетной записью. – nvnagr

0

Вы должны аннулировать токен доступа и выйти из системы. Затем, если вы пойдете на вход в систему, он покажет разрешение.

public static void RevokeAcess(String accessOrRefreshToken) throws ClientProtocolException, IOException 
{ 
    HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/revoke?token="+accessOrRefreshToken); 
    client.execute(post); 
} 

Этот процесс сети должен быть вызван в не Ui нить или asyntask

Смежные вопросы