Cherrypy请求头Basic Authorization鉴权及接口执行控制问询
嘿,这个需求我太熟了,用CherryPy自带的工具就能轻松搞定,完全符合你提到的Basic Authorization规范。下面给你一套完整的实现方案,一步步来:
核心实现思路
CherryPy内置了tools.auth_basic工具,我们只需要自定义一个验证函数,让它去检查请求头里解析出的API密钥是否合法,然后把这个工具绑定到需要保护的处理函数上就行——这样只有鉴权通过的请求才能执行后续逻辑。
完整代码示例
import cherrypy from base64 import b64decode # 替换成你实际的合法API密钥 # 这里的逻辑是:Basic Auth是「用户名:密码」的Base64编码,如果你只需要验证密钥,可以把用户名留空,密钥作为密码 VALID_API_KEYS = {"": "your_real_api_key_here"} # 如果你需要用户名+密钥的组合验证,改成这样:VALID_API_KEYS = {"api_user_1": "key_xxxx", "api_user_2": "key_yyyy"} def validate_credentials(username, password): # 根据你的验证规则调整逻辑 # 仅验证密钥的话,忽略用户名,检查密码是否在合法列表里 return password in VALID_API_KEYS.values() # 如果是用户名+密钥组合,改成:return VALID_API_KEYS.get(username) == password class ProtectedAPIService: @cherrypy.expose # 给需要保护的接口加上auth_basic装饰器 @cherrypy.tools.auth_basic( realm="My Protected API", # 鉴权领域标识,会在401响应头里返回 checkpassword=validate_credentials # 指定我们的验证函数 ) def restricted_action(self): # 这里写你需要鉴权通过后才执行的业务逻辑 return "✅ 鉴权通过!你可以访问这个受保护的接口了" if __name__ == "__main__": cherrypy.quickstart(ProtectedAPIService())
关键部分解释
- 验证函数
validate_credentials:CherryPy会自动解析请求头里的Authorization: Basic <Base64字符串>,把解码后的用户名和密码传给这个函数,我们只需要返回True或False来表示是否通过验证。你可以根据实际需求调整逻辑——比如从数据库拉取合法密钥,而不是硬编码在代码里。 @cherrypy.tools.auth_basic装饰器:把它加到需要保护的处理函数上,就会自动触发鉴权逻辑。如果鉴权失败,CherryPy会自动返回401 Unauthorized响应,不用我们手动处理。
测试方法
用curl就能快速测试:
- 正确请求(替换成你的密钥):
curl -u ":your_real_api_key_here" http://localhost:8080/restricted_action
或者手动构造Authorization头:
curl -H "Authorization: Basic $(echo -n ":your_real_api_key_here" | base64)" http://localhost:8080/restricted_action
- 错误请求(会返回401):
curl http://localhost:8080/restricted_action
进阶优化建议
- 动态加载密钥:不要把密钥硬编码在代码里,可以从环境变量、配置文件或者数据库读取,比如用
os.getenv("API_KEY")获取环境变量里的密钥。 - 自定义401响应:默认的401响应是纯文本,你可以改成JSON格式的错误信息:
def custom_unauthorized_response(): cherrypy.response.status = 401 cherrypy.response.headers["Content-Type"] = "application/json" return b'{"error": "无效或缺失的API密钥,请检查请求头"}' # 然后在装饰器里指定error_response参数 @cherrypy.tools.auth_basic( realm="My Protected API", checkpassword=validate_credentials, error_response=custom_unauthorized_response )
内容的提问来源于stack exchange,提问作者ElliotB
相关产品推荐
相关产品推荐

