帮我写一个基于flask框架的有token验证、权限验证的用户登录系统
时间: 2024-02-03 12:14:54 浏览: 21
好的,以下是一个基于 Flask 框架的用户登录系统,包括 token 验证和权限验证:
```python
from flask import Flask, jsonify, request, make_response
import jwt
import datetime
from functools import wraps
app = Flask(__name__)
app.config['SECRET_KEY'] = 'thisissecret'
# 模拟一个用户数据库
users = {
'admin': 'password123',
'user1': 'password456',
'user2': 'password789'
}
# 定义一个装饰器用于验证 token 和权限
def token_required(permission):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
token = None
if 'Authorization' in request.headers:
token = request.headers['Authorization']
if not token:
return jsonify({'message': 'Token is missing!'}), 401
try:
data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
if permission not in data['permission']:
return jsonify({'message': 'Unauthorized!'}), 401
except:
return jsonify({'message': 'Token is invalid!'}), 401
return func(*args, **kwargs)
return wrapper
return decorator
# 用户登录接口
@app.route('/login')
def login():
auth = request.authorization
if not auth or not auth.username or not auth.password:
return make_response('Could not verify', 401, {'WWW-Authenticate': 'Basic realm="Login required!"'})
if auth.username not in users or users[auth.username] != auth.password:
return make_response('Could not verify', 401, {'WWW-Authenticate': 'Basic realm="Login required!"'})
# 生成 token
token = jwt.encode({'user': auth.username, 'permission': ['admin'] if auth.username == 'admin' else ['user']}, app.config['SECRET_KEY'], algorithm="HS256")
return jsonify({'token': token})
# 需要权限验证的接口
@app.route('/protected')
@token_required('admin')
def protected():
return jsonify({'message': 'This is a protected API!'})
@app.route('/public')
@token_required('user')
def public():
return jsonify({'message': 'This is a public API!'})
if __name__ == '__main__':
app.run(debug=True)
```
这个登录系统使用了 HTTP Basic Auth 来验证用户名和密码,并生成 token 返回给客户端。通过 `@token_required` 装饰器可以对需要权限验证的 API 进行保护,其中的 `permission` 参数表示需要的权限。`@token_required('admin')` 表示只有拥有 `admin` 权限的用户才能访问该 API。