Google не возвращает refresh_token во время POST-вызова токена OAuth, если предыдущий запрос был сделан для того же пользователя Google, используя тот же client_id. Однако, согласно Документам Google, это должно быть разрешено.
Во-первых, да, я знаю, что при создании URL-адреса аутентификации он должен содержать: access_type=offline
Вот пример URL авторизации:
Затем после получения обратного звонка я отправляю сообщение, чтобы получить токен: https://www.googleapis.com/oauth2/v4/token
- client_id = FOO
- client_secret = BASH
- redirect_uri = MYWEBSITE
- grant_type = authorization_code
- код = CALLBACKCODE
Это все работает на 100%, когда выполняется только одно соединение. Если установлено несколько отдельных соединений, поле refresh_token
не возвращается.
Документы Google кажутся немного противоречивыми относительно того, разрешено ли это.
Здесь говорится, что каждая комбинация пользователь / клиент может иметь до 50 токенов обновления: https://developers.google.com/identity/protocols/OAuth2#expiration
В Auth URL документах для поля access_type указано:
Это значение указывает серверу авторизации Google возвращать токен обновления и токен доступа при первом обмене кода авторизации вашим приложением для токенов.
Обратите внимание, что эта проблема возникает при многократном прохождении всего потока с нуля.
Обновление: При рассмотрении этого я удостоверился, что каждый раз в URL-адресе аутентификации указывается state
. Это заставляет Google каждый раз возвращать уникальный код (до того, как он стал тем же самым кодом), но это не решает проблему. Даже с уникальным кодом от Google каждый раз, Google все еще только возвращает refresh_token
в первый раз.