1. 什么是JSON Web Token
JSON Web Token(JWT)是一个开放标准(RFC 7519),用于在不同系统之间安全地传输信息。它可以实现用户身份验证和授权。
JWT包含三部分,分别是头部、载荷和签名。头部包含了加密算法和类型等信息,载荷则存储了需要传输的信息,包括用户ID、角色、过期时间等等,签名则用来验证是否被篡改。
import jwt
# 生成一个JWT Token
payload = {'user_id': 123456, 'role': 'admin'}
jwt_token = jwt.encode(payload, 'secret_key', algorithm='HS256')
print(jwt_token)
2. 什么是Flask-JWT
Flask-JWT是一个针对Flask框架的扩展,它可以方便地为API提供基于JWT的身份验证。使用Flask-JWT,您可以轻松地在应用程序中实现JWT认证,并且可以使用装饰器和中间件来保护API的端点。
3. 安装Flask-JWT
在安装Flask-JWT之前需要先安装Flask。
pip install Flask
pip install Flask-JWT
4. 初始化Flask-JWT
在Flask应用程序中使用Flask-JWT之前,您需要初始化它。
from flask import Flask
from flask_jwt import JWT
app = Flask(__name__)
app.secret_key = 'my-secret-key'
def authenticate(username, password):
# 根据用户名/密码或其他用户凭证,查询数据库验证用户
user = db.get_user(username)
if user and user.check_password(password):
return user
def identity(payload):
# 在JWT Token中存储了用户信息,此处需要从Token中解析出用户信息
user_id = payload['identity']
user = db.get_user_by_id(user_id)
return user
jwt = JWT(app, authenticate, identity)
在上面的代码中,我们定义了一个authenticate函数和一个identity函数用于验证用户和解析JWT Token。JWT对象的构造函数需要传递这两个函数作为参数,并且还需要指定一个秘钥用于生成JWT Token。
5. 使用Flask-JWT保护API
一旦您完成了Flask-JWT的初始化,就可以使用它来保护您的APIEndpoint了。
from flask_jwt import jwt_required
@app.route('/api/protected')
@jwt_required()
def protected():
# 在此处处理API请求
return jsonify({'hello': 'world'})
在上面的代码中,我们使用一个装饰器来指定需要进行身份验证的API端点。这样任何未经验证的请求都将被拒绝,并返回一个HTTP错误代码。
6. Flask-JWT常用方法
6.1. 创建JWT Token
使用Flask-JWT可以轻松地创建和解析JWT Token。
from flask_jwt import jwt_encode
payload = {'user_id': 123456, 'exp': datetime.utcnow() + timedelta(days=30)}
jwt_token = jwt_encode(payload, app.secret_key)
在上面的示例中,我们定义了一个有效期为30天的JWT Token。
6.2. 解析JWT Token
使用JWT解析Token可以得到其中存储的用户信息。
from flask_jwt import jwt_decode
jwt_token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjM0NTYsImV4cCI6MTYyMzEyMTYxNH0.GFn5JSxwOhfxpqPZ9Wmv6jQbLh0zw4Qp3nPOldbPrws'
user_info = jwt_decode(jwt_token, app.secret_key)
以上是使用Flask-JWT实现基于JSON Web Token的身份验证的步骤。