You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:53:10