Почему Google OAuth2 повторно запрашивает разрешение у пользователя, когда я снова отправляю его в адрес аутентификации
В старом google openid, когда я отправлял пользователя (который ранее включил мое приложение) в URL-адрес авторизации, он немедленно перенаправлял его обратно в мое приложение.
Теперь, с OAuth2, URL-адрес авторизации продолжает запрашивать у пользователя разрешение. Я прочитал некоторые документы по этому вопросу, но я не понимаю, как этот поток я должен работать:
- Пользователь входит в Google через мое приложение и нажимает кнопку "Разрешить" для разрешений
- Дни спустя, куки очищаются, пользователь возвращается на мой сайт, нажимает "Войти в Google"
- Пользователь не запрашивает разрешение снова, и они сразу же вошли в систему.
Я думаю, что это как-то связано с сохранением токена аутентификации или токена обновления на шаге 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