Google OAuth не возвращает refresh_token в authlib.starlette_client - PullRequest
1 голос
/ 06 марта 2020

Привет! Я разрабатываю веб-приложение с authlib / FastAPI / Google для процесса входа в систему и хочу сохранить refresh_token, чтобы я мог удерживать пользователя в приложении в течение достаточного времени.

Я следовал стандартная процедура, как в https://docs.authlib.org/en/latest/client/starlette.html

oauth = OAuth()
oauth.register(
  name='google',
  client_id='xxx',
  client_secret='yyy',
  api_base_url='https://www.googleapis.com/oauth2/v3/',
  access_token_url='https://accounts.google.com/o/oauth2/token',
  authorize_url='https://accounts.google.com/o/oauth2/auth',
  jwks_uri='https://www.googleapis.com/oauth2/v3/certs',
  client_kwargs={
    'scope': 'email openid',
    'access_type': 'offline',
    'prompt': 'consent',
  }
)

from starlette.requests import Request

@app.get("/login")
def login_via_google(request: Request):
    redirect_uri = 'https://example.com/auth'
    return await oauth.google.authorize_redirect(request, redirect_uri)

@app.get("/auth")
def auth_via_google(request: Request):
    token = await oauth.google.authorize_access_token(request)
    user = await oauth.google.parse_id_token(request, token)
    return dict(user)

Однако токен не содержит refresh_token, хотя я указал access_type='offline'. Если мое приложение уже зарегистрировано в моей учетной записи, я также добавил параметр prompt='content'.

Я что-то упустил?

Кроме того, для refresh_token лучше всего сохранить долговременное пользовательское приложение? Мне не нравится беспокоить пользователя, чтобы войти в систему несколько раз.

Заранее спасибо!

1 Ответ

0 голосов
/ 06 марта 2020

Большинство языков сценариев возвращают refresh_token только при первой аутентификации пользователя. Предполагается, что вы сохранили его в своей системе и используете его, поэтому вам не понадобится еще один. Таким образом, все другие попытки аутентификации пользователя не будут включать его.

вы можете попытаться заставить их повторно согласиться , однако я не уверен, приведет ли это к новому токену refre sh. Похоже, что вы делаете, так что это не работает.

В этом случае вам, вероятно, нужно отозвать доступ пользователей и запросить его снова. Если у вас нет токена, то Token revoke , затем попросите их снова войти в систему, и вы должны увидеть refre sh token

Если все остальное не получится, включите пользователя go в свою учетную запись Google и удалите доступ ваших приложений к своей учетной записи, а затем попробуйте войти в систему. Это все равно что начинать все сначала и вызывающе даст вам рефрен sh.

...