flask OAuth 状态在请求和响应中不相等
flask OAuth State not equal in request and response
我正在尝试通过 flask 上的 gmail OAuth 对用户进行身份验证,有时用户会成功进行身份验证,然后有时会收到错误消息“请求和响应中的状态不相等。”
请注意,刷新回调页面可以解决问题
error
@auth.route('/login', methods=['POST','GET'])
def login():
if 'google_id' in session:
if col_users.count_documents({'google_id': session["google_id"], 'admin' : 1}) == 1:
return redirect(url_for('adm.administration'))
else:
return redirect(url_for('dash.add_item'))
authorization_url, state = flow.authorization_url()
session['state'] = state
session.modified = True
return redirect(authorization_url)
@auth.route('/callback', methods=['POST','GET'])
def callback():
flow.fetch_token(authorization_response=request.url)
if session['state'] != request.args.get('state'):
abort(500)
credentials = flow.credentials
request_session = requests.session()
cached_seession = cachecontrol.CacheControl(request_session)
token_request = google.auth.transport.requests.Request(session=cached_seession)
id_info = id_token.verify_oauth2_token(
id_token = credentials._id_token,
request = token_request,
audience = GOOGLE_CLIENT_ID
)
session['google_id'] = id_info['email']
session['name'] = id_info['name']
session.modified = True
if col_users.count_documents({'google_id' : session['google_id'], 'admin' : 1}) == 1:
return redirect(url_for('adm.administration'))
else:
return redirect(url_for('dash.add_item'))
这很可能是由于并行请求的缘故,每个请求都使用不同的状态参数向提供者创建自己的身份验证请求。在 return 上,state/response 可能与“其他”请求不匹配。您可能需要考虑避免这些请求。
使用新更新的 flask-session 模块修复了问题:flask-sessionstore
我正在尝试通过 flask 上的 gmail OAuth 对用户进行身份验证,有时用户会成功进行身份验证,然后有时会收到错误消息“请求和响应中的状态不相等。” 请注意,刷新回调页面可以解决问题 error
@auth.route('/login', methods=['POST','GET'])
def login():
if 'google_id' in session:
if col_users.count_documents({'google_id': session["google_id"], 'admin' : 1}) == 1:
return redirect(url_for('adm.administration'))
else:
return redirect(url_for('dash.add_item'))
authorization_url, state = flow.authorization_url()
session['state'] = state
session.modified = True
return redirect(authorization_url)
@auth.route('/callback', methods=['POST','GET'])
def callback():
flow.fetch_token(authorization_response=request.url)
if session['state'] != request.args.get('state'):
abort(500)
credentials = flow.credentials
request_session = requests.session()
cached_seession = cachecontrol.CacheControl(request_session)
token_request = google.auth.transport.requests.Request(session=cached_seession)
id_info = id_token.verify_oauth2_token(
id_token = credentials._id_token,
request = token_request,
audience = GOOGLE_CLIENT_ID
)
session['google_id'] = id_info['email']
session['name'] = id_info['name']
session.modified = True
if col_users.count_documents({'google_id' : session['google_id'], 'admin' : 1}) == 1:
return redirect(url_for('adm.administration'))
else:
return redirect(url_for('dash.add_item'))
这很可能是由于并行请求的缘故,每个请求都使用不同的状态参数向提供者创建自己的身份验证请求。在 return 上,state/response 可能与“其他”请求不匹配。您可能需要考虑避免这些请求。
使用新更新的 flask-session 模块修复了问题:flask-sessionstore