欢迎访问宙启技术站
智能推送

使用Python编写的Token-based认证控制器

发布时间:2024-01-02 16:20:27

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应用程序。