一些oAuth教程使用Flask会话在flask会话中存储状态参数和访问令牌。(Brendan McCollam在Pycon上的非常有用的演示是一个例子)
我了解到Flask将会话存储在客户端的cookie中,而且很容易被暴露出来(请参阅Michael Grinberg的how-secure-is-the-flask-user-session)。我自己尝试过,可以看到令牌的过期等信息。
将状态和令牌存储在Flask会话中是否正确,或者它们应该存储在其他地方?
代码示例:
我了解到Flask将会话存储在客户端的cookie中,而且很容易被暴露出来(请参阅Michael Grinberg的how-secure-is-the-flask-user-session)。我自己尝试过,可以看到令牌的过期等信息。
将状态和令牌存储在Flask会话中是否正确,或者它们应该存储在其他地方?
代码示例:
@app.route('/login', methods=['GET'])
def login():
provider = OAuth2Session(
client_id=CONFIG['client_id'],
scope=CONFIG['scope'],
redirect_uri=CONFIG['redirect_uri'])
url, state = provider.authorization_url(CONFIG['auth_url'])
session['oauth2_state'] = state
return redirect(url)
@app.route('/callback', methods=['GET'])
def callback():
provider = OAuth2Session(CONFIG['client_id'],
redirect_uri=CONFIG['redirect_uri'],
state=session['oauth2_state'])
token_response = provider.fetch_token(
token_url=CONFIG['token_url'],
client_secret=CONFIG['client_secret'],
authorization_response=request.url)
session['access_token'] = token_response['access_token']
session['access_token_expires'] = token_response['expires_at']
transfers = provider.get('https://transfer.api.globusonline.org/v0.10/task_list?limit=1')
return redirect(url_for('index'))
@app.route('/')
def index():
if 'access_token' not in session:
return redirect(url_for('login'))
transfers = requests.get('https://transfer.api.globusonline.org/v0.10/task_list?limit=1',
headers={'Authorization': 'Bearer ' + session['access_token']})
return render_template('index.html.jinja2',
transfers=transfers.json())