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

使用Python实现基于令牌的用户授权

发布时间:2023-12-17 18:42:08

在Python中,可以使用JWT(JSON Web Tokens)来实现基于令牌的用户授权。JWT是一种开放的标准(RFC 7519),它定义了一种紧凑且独立的方式在不同实体之间传递信息,该信息可以进行验证和信任,同时还可以进行数字签名。JWT由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

下面是使用Python实现基于令牌的用户授权的示例代码:

import jwt

# 定义秘钥
secret_key = "your-secret-key"

# 用户登录
def login(username, password):
    # 验证用户信息
    if verify_user(username, password):
        # 生成JWT令牌
        token = generate_token(username)
        return token
    else:
        return None

# 生成JWT令牌
def generate_token(username):
    payload = {"username": username}
    token = jwt.encode(payload, secret_key, algorithm="HS256")
    return token.decode("utf-8")

# 验证JWT令牌
def verify_token(token):
    try:
        decoded_token = jwt.decode(token, secret_key, algorithms=["HS256"])
        username = decoded_token["username"]
        return username
    except jwt.ExpiredSignatureError:
        # 令牌过期
        return None
    except jwt.DecodeError:
        # 令牌验证失败
        return None

# 令牌授权验证
def authorize(token_required):
    def decorator(func):
        def wrapper(*args, **kwargs):
            token = request.headers.get("Authorization")
            if token is None:
                # 没有提供令牌
                return "Authorization required", 401
            username = verify_token(token)
            if username is None:
                # 令牌验证失败
                return "Invalid token", 401
            # 令牌验证成功,调用被装饰的函数
            return func(*args, **kwargs)
        return wrapper
    return decorator

# 示例应用
from flask import Flask, request

app = Flask(__name__)

# 用户验证
def verify_user(username, password):
    # 根据提供的用户名和密码验证用户信息
    if username == "admin" and password == "admin123":
        return True
    else:
        return False

# 用户登录接口
@app.route("/login", methods=["POST"])
def user_login():
    data = request.get_json()
    username = data["username"]
    password = data["password"]
    token = login(username, password)
    if token is not None:
        return {"token": token}, 200
    else:
        return "Invalid login", 401

# 受保护的接口
@app.route("/protected", methods=["GET"])
@authorize(token_required=True)
def protected_resource():
    return "Protected resource"

if __name__ == "__main__":
    app.run()

以上代码示例实现了一个基于令牌的用户授权系统。用户可以通过发送POST请求到/login接口进行登录,并获取JWT令牌。在需要进行授权验证的接口上使用@authorize(token_required=True)装饰器,可以实现对受保护资源的访问控制。在每个请求中,需要在请求头中提供Authorization字段,其值为生成的JWT令牌。使用verify_token函数可以验证JWT令牌的有效性,并获取用户名。如果令牌验证失败或没有提供令牌,将返回相应的错误信息。

请注意,上述示例代码仅提供了基础的实现方式,并没有涉及其他安全性措施,如令牌刷新、令牌撤销、角色授权等。在实际使用中,需要根据具体的应用场景和需求进行扩展和改进。