Почему Google OAuth2 повторно запрашивает разрешение у пользователя, когда я снова отправляю его в адрес аутентификации

В старом google openid, когда я отправлял пользователя (который ранее включил мое приложение) в URL-адрес авторизации, он немедленно перенаправлял его обратно в мое приложение.

Теперь, с OAuth2, URL-адрес авторизации продолжает запрашивать у пользователя разрешение. Я прочитал некоторые документы по этому вопросу, но я не понимаю, как этот поток я должен работать:

  1. Пользователь входит в Google через мое приложение и нажимает кнопку "Разрешить" для разрешений
  2. Дни спустя, куки очищаются, пользователь возвращается на мой сайт, нажимает "Войти в Google"
  3. Пользователь не запрашивает разрешение снова, и они сразу же вошли в систему.

Я думаю, что это как-то связано с сохранением токена аутентификации или токена обновления на шаге 1, но на шаге 3 я не знаю, кто они, поэтому как мне сопоставить их с правильным токеном аутентификации или обновления, чтобы получить действительный токен? токен доступа.

В моих тестах, когда я отправляю их на исходный URL-адрес авторизации на шаге 1, у них снова запрашиваются разрешения.

РЕДАКТИРОВАТЬ: нашел решение

При создании auth-адреса google-api по умолчанию помещает "Approve_Prompt = Force".

3 ответа

Решение

Да, как вы уже заметили, использование параметра URL утверждения_prompt = force заставит каждый раз показывать пользователю диалог авторизации. Просто удалив этот параметр URL, пользователь не получит приглашение в последующих потоках аутентификации.

Существует небольшая разница в ответе, который вы получите, если будете использовать поток на стороне сервера (response_type=code) и автономный доступ (access_type=offline). В первый раз, когда пользователь авторизует вас (когда он видит экран подтверждения) или если вы форсируете это с помощью Approval_prompt=force, тогда при обмене кодом авторизации вам будут предоставлены refresh_token и access_token.

Однако каждый раз, когда пользователь не отображается с экраном подтверждения (последующая авторизация, когда не используется утверждение_процесс = сила), при обмене кодом авторизации вам будет предоставлен только access_token, но не refresh_token. Так что, если вы используете этот поток, и если вы хотите иметь доступ к данным пользователя в автономном режиме, вам нужно убедиться, что вы сохраняете refresh_token локально для будущего использования, когда вы получите его в первый раз. Это может произойти только в том случае, если вы запрашиваете доступ к данным другого типа, а не просто к данным аутентификации (используя поток OAuth 2, вы можете запросить доступ к другим данным, например, к данным API контактов, данным API календаря, данным накопителя и т. Д.).) как обычно, обычный поток открытых идентификаторов не требует автономного доступа.

Небольшое обновление, эта ссылка может помочь: https://github.com/googleapis/oauth2client/issues/453

"запрос на утверждение" был заменен на "запрос" с параметрами: "нет", "согласие" и "выбор_аккаунта"

Просто передав дополнительный параметр в запросе 'approval_prompt=auto' работал на меня.

Для меня это было hd (размещенный домен) параметр. После удаления из URL авторизации мне был предоставлен список пользователей, которых нужно выбрать для авторизации. Больше информации о hd здесь параметр https://developers.google.com/identity/protocols/OpenIDConnect

Другие вопросы по тегам