gpt4 book ai didi

session - 在 Flask session 中存储 oAuth 状态 token

转载 作者:行者123 更新时间:2023-12-03 15:46:08 24 4
gpt4 key购买 nike

一些关于 oAuth 的教程使用 Flask session 在 Flask session 中存储状态参数和访问 token 。 (Brendan McCollam's very useful presentation from Pycon is an example)

我知道 Flask 将 session 存储在客户端的 cookie 中,并且它们很容易公开( see Michael Grinberg's how-secure-is-the-flask-user-session) 。我自己尝试过,并且能够看到 token 过期等。

将状态和 token 存储在 flask session 中是否正确,或者它们应该存储在其他地方?

代码示例:

@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())

最佳答案

我认为一些教程过度简化以显示更简单的代码。一个好的经验法则是仅将 session cookie 用于您的应用程序和用户浏览器必须知道的信息,并且不是私有(private)的。这通常会转化为 session ID 和可能的其他非敏感信息,例如语言选择。

应用该经验法则,我建议在每个标记旁边使用:

  • 授权 token :根据定义,用户和应用程序都知道此数据,因此在 cookie 中公开它不应该是安全问题。但是,一旦您获得访问代码,确实没有必要保留此 token ,因此我建议您不要将其保存在本地或您的 cookie 中。
  • 访问代码 :此数据必须被视为 secret ,并且只能由您的应用程序和提供者知道。没有理由让任何其他方(包括用户)知道它,因此它不应包含在 cookie 中。如果您需要存储它,请将其本地保存在您的服务器中(可能在您的数据库中,引用您的用户 session ID)。
  • CSRF 状态 token :理想情况下,此数据作为隐藏表单字段包含在内,并针对服务器端变量进行验证,因此 cookie 似乎是不必要的复杂化。但我不会担心这些数据在 cookie 中,因为它无论如何都是响应的一部分。

  • 请记住,有诸如 flask session 之类的扩展,实际上相同的代码使用服务器端变量而不是 cookie 变量。

    关于session - 在 Flask session 中存储 oAuth 状态 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45911232/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com