Клиент OAuth должен предотвращать CSRF, как это указано в OAuth2
Спецификация. Один из способов добиться этого — использовать параметр state
, чтобы поддерживать состояние между вашим запросом авторизации и ответом сервера авторизации
.
Итак, я следую этому примеру и сохраняю состояние в переменной сеанса.
Код: Выделить всё
@app.route('/auth')
def auth():
auth_url, state = get_oauth_flow().authorization_url()
app.logger.debug(f'Setting session state: {state}')
flask.session['state'] = state
return flask.redirect(auth_url)
@app.route('/oauth2callback')
def oauth2callback():
session_state = flask.session.get('state')
request_state = flask.request.args.get('state')
app.logger.debug(f'Got session state: {session_state}')
app.logger.debug(f'Got request state: {request_state}')
if session_state is None or session_state != request_state:
return 'Danger, Will Robinson!', 400
del flask.session['state']
flow = get_oauth_flow()
flow.fetch_token(authorization_response=flask.request.url)
flask.session['oauth_token'] = flow.credentials.token
return flask.redirect('success')
Код: Выделить всё
DEBUG in ging: Setting session state: ijV2BAyuZG8uSO4rpN77nczw5UDEJf
DEBUG in ging: Got session state: None, referer: https://accounts.youtube.com/
DEBUG in ging: Got request state: ijV2BAyuZG8uSO4rpN77nczw5UDEJf, referer: https://accounts.youtube.com/
Подробнее здесь: https://stackoverflow.com/questions/792 ... prevention
Мобильная версия