Auth0 Python快速入门:ID Token签名与过期时间验证疑问
Flask + Auth0 应用安全疑问咨询
我正在构建一个以Auth0作为OpenID Connect提供商的Python Flask应用,采用Auth0官网提供的骨架代码作为开发起点。该代码可正常运行且易于扩展,但我对其实现逻辑及是否符合现代安全标准存在疑问,现向专家咨询:
我对骨架代码的理解
用户与应用交互流程如下:
- 用户访问
http://localhost:3000/,触发Flask的home端点,因无会话Cookie,返回含“Hello guest”和登录按钮的HTML。 - 用户点击登录按钮,访问
http://localhost:3000/login,触发login端点,重定向至Auth0登录界面。 - 用户输入邮箱和用户名后,被重定向至
http://localhost:3000/callback,URL查询参数携带授权码。 - 触发
callback端点,将授权码发送至Auth0换取ID Token和Access Token,设置包含这两个令牌的会话Cookie,并重定向至首页。 - 再次触发
home端点,因存在会话Cookie,返回含Welcome {username}及ID Token中用户信息的HTML。
会话Cookie由ID Token、Access Token及通过Flask应用密钥生成的签名构成。
疑问1:JWT签名验证
ID Token是JWT,由Auth0私钥签名,可通过Auth0公钥(JWK)验证。但我发现home端点使用ID Token作为用户身份凭证时,似乎未验证其签名,请问:
- 我的判断是否正确?
- 若正确,这是否存在安全问题?是否需要修复?
注:当前存在两类签名:一是ID Token内由Auth0私钥签名的签名;二是会话Cookie上由Flask应用密钥签名的签名。攻击者因无Flask密钥无法伪造会话Cookie,看似安全,但我担心遗漏了ID Token签名的防护场景。
疑问2:JWT过期时间验证
ID Token包含过期时间,但home端点似乎未检查其是否过期,请问:
- 我的判断是否正确?
- 若正确,这是否属于错误?
请指正我的误解并提供术语建议,我希望学习相关知识。
代码示例
server.py
import json from os import environ as env from authlib.integrations.flask_client import OAuth from flask import Flask, redirect, render_template, session, url_for app = Flask(__name__) app.secret_key = env.get("APP_SECRET_KEY") oauth = OAuth(app) oauth.register( "auth0", client_id=env.get("AUTH0_CLIENT_ID"), client_secret=env.get("AUTH0_CLIENT_SECRET"), client_kwargs={"scope": "openid profile email"}, server_metadata_url=f'https://{env.get("AUTH0_DOMAIN")}/.well-known/openid-configuration' ) @app.route("/login") def login(): return oauth.auth0.authorize_redirect( redirect_uri=url_for("callback", _external=True) ) @app.route("/callback", methods=["GET", "POST"]) def callback(): token = oauth.auth0.authorize_access_token() session["user"] = token return redirect("/") @app.route("/") def home(): return render_template( "home.html", session=session.get('user'), pretty=json.dumps(session.get('user'), indent=4) ) if __name__ == "__main__": app.run(host="0.0.0.0", port=env.get("PORT", 3000))
templates/home.html
<html> <head> <meta charset="utf-8" /> <title>Auth0 Example</title> </head> <body> {% if session %} <h1>Welcome {{session.userinfo.name}}!</h1> <p><a href="/logout">Logout</a></p> <div><pre>{{pretty}}</pre></div> {% else %} <h1>Welcome Guest</h1> <p><a href="/login">Login</a></p> {% endif %} </body> </html>
内容的提问来源于stack exchange,提问作者Kenny Wong
相关产品推荐
相关产品推荐

