最近在学习python,并对开发框架的登录模块进行完善,总结一份记录。
首先,需要安装PyJWT模块,这是用于实现JWT校验的常用模块之一。可以使用pip命令来安装该模块,例如:
pip install PyJWT
然后,需要编写登录接口的代码,其中可以使用requests模块来向远程的SSO服务器发起get请求,获取到服务器返回的token并将其存储在header中。示例代码如下:
import requests
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['GET'])
def login():
ticket = request.args.get('ticket', 'QWERTYUIOPCAS')
service = request.args.get('service', 'http://127.0.0.1:5000')
sso_url = 'http://sso.service.com?ticket={}&service={}'.format(ticket, service)
response = requests.get(sso_url)
token = response.json()['token']
headers = {'Authorization': 'Bearer {}'.format(token)}
# 将token存储在header中,以便后续接口的校验使用
# 可以将headers变量存储在全局变量中,以便后续接口的使用
return 'Login Success!'
if __name__ == '__main__':
app.run()
接下来,需要对get_list和get_menu接口进行JWT校验。可以使用Flask中的装饰器来实现该功能。示例代码如下:
import jwt
from flask import Flask, request
app = Flask(__name__)
# 定义装饰器,用于校验JWT
def jwt_required(func):
def wrapper(*args, **kwargs):
# 获取请求头中的Authorization字段
token = request.headers.get('Authorization')
if not token:
return 'Missing Token', 401
try:
# 验证JWT,并获取payload中的信息
payload = jwt.decode(token.split(' ')[-1], 'secret_key', algorithms=['HS256'])
# 在payload中可以获取到用户名等信息,可以根据需要进行处理
except:
return 'Invalid Token', 401
return func(*args, **kwargs)
return wrapper
# 定义get_list接口,并使用jwt_required装饰器进行校验
@app.route('/get_list', methods=['GET'])
@jwt_required
def get_list():
# 接口的实际实现
return 'Get List Success!'
# 定义get_menu接口,并使用jwt_required装饰器进行校验
@app.route('/get_menu', methods=['GET'])
@jwt_required
def get_menu():
# 接口的实际实现
return 'Get Menu Success!'
if __name__ == '__main__':
app.run()
在上述代码中,jwt_required装饰器用于校验JWT。当请求的Authorization字段中不包含有效的JWT时,会返回401状态码;当JWT无效时,会返回同样的状态码。可以根据实际需要进行修改。
最后,需要为项目生成一个密钥,并将其存储在配置文件中。在上述代码中,我们使用的是字符串'secret_key',实际上您应该使用一个更加安全的随机生成的字符串来作为密钥。可以使用Python中的secrets模块来生成随机字符串,例如:
import secrets
# 生成一个32字节的随机字符串作为密钥
secret_key = secrets.token_hex(32)
将密钥存储在配置文件中,并在项目启动时从配置文件中读取该密钥,例如:
app = Flask(__name__)
app.config.from_pyfile('config.py')
# 获取密钥
secret_key = app.config['SECRET_KEY']
在配置文件(config.py)中,需要添加以下内容:
SECRET_KEY = 'your-secret-key'
将'your-secret-key'替换为生成的随机字符串即可。