Python-JWT 实现登录token生成和接口校验
假设您已经有了一个基础的用户登录功能,并且现在要添加JWT生成与校验的部分。下面是一个结合了登录验证和JWT生成及校验的简化版Python后端示例:
pip install PyJWT
然后,可以按如下方式对登录功能进行封装:
import jwt
import time
from datetime import datetime, timedelta
from flask import Flask, request, jsonify
from werkzeug.security import check_password_hash
app = Flask(__name__)
# 假设我们有一个简单的用户数据库,这里仅模拟一个用户数据字典
users = {
'john_doe': {'username': 'john_doe', 'password': 'hashed_password_here'}
}
# 秘钥用于签名JWT
SECRET_KEY = 'your-very-secret-key'
@app.route('/login', methods=['POST'])
def login():
data = request.get_json()
# 检查用户名是否存在以及密码是否匹配
if data['username'] in users and check_password_hash(users[data['username']]['password'], data['password']):
# 登录成功,创建JWT
payload = {
'username': data['username'],
'iat': datetime.now(),
'exp': datetime.now() + timedelta(hours=1) # 设置token有效期为1小时
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
response = jsonify({'message': 'Login successful', 'access_token': token.decode('utf-8')})
response.status_code = 200
return response
else:
# 登录失败
return jsonify({'message': 'Invalid credentials'}), 401
@app.route('/protected_route', methods=['GET'])
def protected_route():
# 获取请求头中的Authorization字段中的JWT
auth_header = request.headers.get('Authorization')
if auth_header:
try:
token = auth_header.split(' ')[1] # 获取Bearer后面的token字符串
payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
# 如果能正常解码,则认为Token有效,允许访问受保护资源
return jsonify({'message': f'Welcome, {payload["username"]}'})
except jwt.ExpiredSignatureError:
return jsonify({'message': 'Token has expired'}), 401
except jwt.InvalidTokenError:
return jsonify({'message': 'Invalid token'}), 401
# 若无有效token,拒绝访问
return jsonify({'message': 'Missing or invalid token'}), 401
if __name__ == '__main__':
app.run(debug=True)
这个示例包括:
用户通过POST请求到/login接口提交其凭证(用户名和密码)。
服务器检查用户名和密码是否正确。
登录成功时,生成JWT并将其作为响应的一部分返回给客户端。
客户端在后续请求中将JWT放入请求头的Authorization字段(通常是"Bearer {token}"格式)。
受保护路由会在处理请求前先校验JWT的有效性,如果有效则允许访问,否则返回401 Unauthorized错误。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Coke(cokeserver@qq.com)
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果