使用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令牌的有效性,并获取用户名。如果令牌验证失败或没有提供令牌,将返回相应的错误信息。
请注意,上述示例代码仅提供了基础的实现方式,并没有涉及其他安全性措施,如令牌刷新、令牌撤销、角色授权等。在实际使用中,需要根据具体的应用场景和需求进行扩展和改进。
