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

无需登录的Flask API授权实现方案咨询

给Flask API添加JWT认证,确保请求携带有效令牌

1. 安装依赖

直接用pip安装Flask官方推荐的JWT扩展,它封装了JWT生成、验证的核心逻辑,不用自己从零实现:

pip install flask-jwt-extended

2. 配置JWT基础参数

在Flask应用初始化时,配置JWT密钥和过期时间,生产环境绝对不能硬编码密钥,要通过AWS App Runner的环境变量注入:

import os
from flask import Flask, jsonify
from flask_jwt_extended import JWTManager, jwt_required, get_jwt_identity

app = Flask(__name__)

# 从环境变量读取密钥,生产环境在App Runner控制台配置该变量
app.config["JWT_SECRET_KEY"] = os.getenv("JWT_SECRET_KEY")
# 可选:设置令牌过期时间,比如1小时(3600秒)
app.config["JWT_ACCESS_TOKEN_EXPIRES"] = 3600

jwt = JWTManager(app)

3. 保护目标API接口

给/api/text_bot接口加上@jwt_required()装饰器,这样只有携带有效JWT令牌的请求才能进入业务逻辑:

@app.route("/api/text_bot", methods=["GET"])
@jwt_required()
def text_bot():
    # 可选:获取令牌中携带的用户身份信息(比如用户ID、用户名)
    current_user = get_jwt_identity()
    # 原有业务代码
    response = {"message": "请求处理完成", "user": current_user}
    return jsonify(response)

4. 令牌的生成与分发

  • 内部AWS Lambda调用:把预先生成的有效令牌存在AWS Secrets Manager中,Lambda调用API前,先从Secrets Manager读取令牌,再在请求头中添加Authorization: Bearer <你的JWT令牌>。
  • 官网用户调用:先实现用户登录接口,用户登录验证通过后返回JWT令牌;前端拿到令牌后,存在HttpOnly、Secure的Cookie中(避免XSS风险),每次调用/api/text_bot时自动携带该令牌到请求头。

登录接口示例(供官网用户使用):

from flask import request
from flask_jwt_extended import create_access_token

@app.route("/login", methods=["POST"])
def login():
    # 这里替换成你的用户名密码验证逻辑
    username = request.json.get("username")
    password = request.json.get("password")
    if username == "合法用户名" and password == "合法密码":
        # 生成令牌,可传入用户身份信息(比如用户名)
        access_token = create_access_token(identity=username)
        return jsonify(access_token=access_token)
    return jsonify({"msg": "用户名或密码错误"}), 401

5. 生产环境安全注意事项

  • 强制开启HTTPS传输,防止令牌在网络中被明文窃取。
  • 定期轮换JWT密钥,不要长期使用同一密钥。
  • 令牌过期时间设置合理,避免过长时间有效,降低泄露风险。
  • 官网端禁止用localStorage存储令牌,优先用HttpOnly、Secure属性的Cookie。

内容的提问来源于stack exchange,提问作者iambdot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:16:01