优秀的编程知识分享平台

网站首页 > 技术文章 正文

Flask 应用程序的扩展 - Flask-JWT

nanyue 2024-10-15 11:33:34 技术文章 5 ℃

Flask-JWT(JSON Web Tokens for Flask)是一个用于 Flask 应用程序的扩展,它允许你实现基于 JSON Web Tokens (JWT) 的无状态身份验证机制。JWT 是一种开放标准,用于在各方之间安全地传输信息作为 JSON 对象。


安装


通过 pip 安装 Flask-JWT:


pip install flask-jwt


配置


在 Flask 应用中配置 JWT 所需的参数,通常在配置文件中设置:


# config.py

JWT_SECRET_KEY = 'your-secret-key'

JWT_TOKEN_LOCATION = ['headers']

JWT_HEADER_NAME = 'Authorization'

JWT_ACCESS_TOKEN_EXPIRES = timedelta(minutes=60)

JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=30)


初始化


在 Flask 应用中初始化 Flask-JWT 扩展:


from flask import Flask

from flask_jwt import JWT


app = Flask(__name__)

app.config.from_object('config.Config')

jwt = JWT(app)


创建和验证令牌


创建 JWT 令牌通常涉及到用户登录的流程。一旦用户成功登录,服务器将生成一个 JWT 令牌并发送给客户端。


from werkzeug.security import safe_str_cmp


@app.route('/login', methods=['POST'])

def login():

username = request.json.get('username', None)

password = request.json.get('password', None)

if username and password and safe_str_cmp(username, 'admin') and safe_str_cmp(password, 'password'):

token = jwt.encode({'username': username}, app.config['JWT_SECRET_KEY'])

return {'token': token}

else:

return {'error': 'Invalid credentials'}, 400


客户端在随后的每个请求中都需要携带这个令牌,通常是在 HTTP 请求的头部(Authorization header)。服务器接收到请求后,会验证令牌的有效性。


@app.before_request

def parse_jwt():

token = request.headers.get('Authorization', None)

if not token:

return jwt_required()

try:

# 验证令牌并获取用户信息

payload = jwt.decode(token, app.config['JWT_SECRET_KEY'])

except:

# 令牌无效或已过期

return jwt_required()

# 将用户信息存储在 g 对象中,供后续请求使用

g.current_user = payload.get('username')


刷新令牌


Flask-JWT 允许使用刷新令牌来延长访问令牌的有效期。刷新令牌的有效期通常比访问令牌长很多。


from flask_jwt import refresh_token_required


@app.route('/refresh', methods=['POST'])

@refresh_token_required()

def refresh():

new_token = jwt.refresh_token_loader(request.json.get('refresh_token'))

return {'token': new_token}


保护路由


可以使用 @jwt_required() 装饰器来保护特定的路由,确保只有持有有效 JWT 的用户才能访问。


from flask_jwt import jwt_required


@app.route('/protected')

@jwt_required()

def protected():

return {'data': 'This is a protected resource only accessible with a valid JWT'}


Flask-JWT 是实现基于令牌的身份验证的便捷方式,它支持无状态认证,有助于构建可扩展且安全的 Flask 应用程序。通过使用 JWT,可以减少对数据库的频繁查询,提高应用性能。

最近发表
标签列表