使用Python编写的Token-based认证控制器
Token-based认证是一种常见的身份验证方式,它使用令牌作为身份验证凭据,可以在Web应用程序中实现安全的用户认证和授权。在Python中,我们可以使用JWT(JSON Web Token)库来实现Token-based认证控制器。
首先,我们需要安装所需的库。在终端中运行以下命令:
pip install pyjwt
接下来,我们可以编写Token-based认证控制器的代码。下面是一个示例:
import jwt
from datetime import datetime, timedelta
SECRET_KEY = 'your-secret-key'
class AuthController:
@staticmethod
def generate_token(payload):
# 生成JWT令牌
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
return token
@staticmethod
def verify_token(token):
try:
# 验证并解码JWT令牌
payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
return payload
except jwt.ExpiredSignatureError:
# 令牌过期
return None
except jwt.InvalidTokenError:
# 令牌无效
return None
@staticmethod
def get_current_user():
# 获取当前用户
token = request.headers.get('Authorization')
if not token:
return None
token = token.split(' ')[1] # 去掉Bearer前缀
payload = AuthController.verify_token(token)
if payload:
return payload.get('user_id')
return None
在上面的代码中,我们定义了一个AuthController类,它包含了生成和验证JWT令牌的方法。我们使用pyjwt库来处理JWT令牌的编码和解码。
generate_token方法用于生成JWT令牌。它接收一个payload参数,该参数是一个字典,包含需要在令牌中传递的信息。在示例中,我们可以使用user_id作为载荷的一部分。
verify_token方法用于验证并解码JWT令牌。它接收一个token参数,并尝试解码令牌。如果令牌有效,则返回包含载荷信息的字典。如果令牌已过期或无效,则返回None。
get_current_user方法用于获取当前用户。它首先从请求头中获取包含Bearer令牌的Authorization标头,然后调用verify_token方法来验证令牌并获取用户ID。
下面是一个使用Token-based认证控制器的示例:
from flask import Flask, request
from auth_controller import AuthController
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
# 在此处进行用户身份验证,验证通过后生成令牌
user_id = 1
payload = {'user_id': user_id}
token = AuthController.generate_token(payload)
return {'token': token}
@app.route('/protected')
def protected():
# 获取当前用户并进行授权验证
current_user = AuthController.get_current_user()
if current_user is None:
return {'message': 'Unauthorized'}, 401
return {'protected_data': 'example data'}
if __name__ == '__main__':
app.run()
在上面的示例中,我们首先在/login路由中进行用户身份验证,并在验证通过后生成令牌。然后,在/protected路由中使用Token-based认证控制器来获取当前用户并进行授权验证。如果用户未通过身份验证,将返回401未经授权的响应。
这是一个简单的Token-based认证控制器的实现示例。在实际的应用程序中,您可能还需要实现其他功能,如过期令牌的刷新、权限验证等。但是,这个示例可以作为起点帮助您开始构建一个安全的Web应用程序。
