📅  最后修改于: 2023-12-03 14:43:37.771000             🧑  作者: Mango
本篇文章将介绍如何在 Python Flask 中使用 JWT 进行身份验证。JWT 是一种用于跨域请求认证的标准,可以通过一个 JSON 对象来传递认证信息,特别适用于分布式系统。
在学习本篇文章之前,需要掌握以下知识点:
首先,我们需要安装必要的 Python 库:
pip install flask
pip install pyjwt
然后,我们需要初始化 Flask 应用,并定义一些必要的配置:
from flask import Flask
app = Flask(__name__)
app.config['SECRET_KEY'] = 'my_secret_key' # 密钥,用于签名 JWT
接下来,我们将编写一个装饰器,用于验证用户的身份。在该装饰器中,我们将从请求头中读取 JWT 令牌,然后进行解码和验证。如果令牌验证通过,则将当前用户设置为全局变量 g 中。
from flask import g, request
import jwt
def login_required(func):
def wrapper(*args, **kwargs):
token = request.headers.get('Authorization', None)
if token is None:
return {'error': '登录态已失效,请重新登录。'}
try:
payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
g.user_id = payload['user_id']
g.username = payload['username']
except jwt.DecodeError:
return {'error': '登录态已失效,请重新登录。'}
except jwt.ExpiredSignatureError:
return {'error': '登录态已过期,请重新登录。'}
return func(*args, **kwargs)
return wrapper
经过上述操作,我们就成功地将 JWT 令牌解码并验证了。
在用户登录时,我们需要生成一个 JWT 令牌并将其返回给客户端。在本示例中,我们将 JWT 令牌的有效期设置为 1 小时。
import datetime
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
if username == 'admin' and password == 'admin':
expiration = datetime.datetime.utcnow() + datetime.timedelta(hours=1)
token = jwt.encode({
'user_id': 1,
'username': 'admin',
'exp': expiration
}, app.config['SECRET_KEY'], algorithm='HS256')
return {'token': token}, 200
else:
return {'error': '用户名或密码错误。'}, 401
现在,我们就可以使用上面定义的装饰器进行身份验证了。在本示例中,我们定义了一个需要登录态才能访问的 API:
@app.route('/userinfo', methods=['GET'])
@login_required
def userinfo():
return {'user_id': g.user_id, 'username': g.username}, 200
在访问该 API 时,客户端需要将 JWT 令牌包含在请求头中:
Authorization: <token>
至此,我们已经完成了 Python Flask 中使用 JWT 进行身份验证的示例,希望对大家有所帮助。完整代码见下: