如何在Tornado中获取请求的Authentication Header?
你的问题主要出在两个地方:一是没有正确获取当前请求的头信息,二是请求头的拼写可能不符合标准规范,我来一步步帮你修正:
1. 错误根源:创建了空的HTTPHeaders实例
你当前代码里新建了一个空的tornado.httputil.HTTPHeaders()对象,这完全和当前请求的头信息无关。Tornado的RequestHandler已经内置了请求头的属性——self.request.headers,直接用它就能拿到当前请求的所有HTTP头。
2. 注意请求头的拼写规范
标准的JWT认证请求头是Authorization: Bearer {token},而你提到用的是Authentication,这是拼写错误,会导致服务端拿不到正确的头信息。建议统一改成标准的Authorization,如果暂时需要兼容旧请求,也可以在代码里同时检查两个字段。
修正后的完整代码(适配JWT场景)
class HeaderHandler(tornado.web.RequestHandler): def get(self): # 优先获取标准的Authorization头,兼容拼写错误的Authentication auth_header = self.request.headers.get("Authorization") or self.request.headers.get("Authentication") if auth_header: try: # 拆分认证类型和token,注意处理格式错误 token_type, token = auth_header.split(" ", 1) if token_type.lower() == "bearer": # 这里可以加入你的JWT验证逻辑,比如用PyJWT库解码 # import jwt # payload = jwt.decode(token, "your_secret_key", algorithms=["HS256"]) response = { 'message': '成功获取到Bearer Token', 'extracted_token': token } else: response = { 'message': '仅支持Bearer类型的认证' } except ValueError: response = { 'message': '认证头格式错误,请使用 "Bearer {token}" 的格式' } else: response = { 'message': '请求中未包含Authorization头' } self.write(response)
关键说明
self.request.headers是Tornado提供的请求头字典,用get()方法可以安全获取指定字段(HTTP头本身不区分大小写,但Tornado会统一处理成首字母大写的格式,比如authorization会变成Authorization,直接用大写开头的字段名即可)。- 拆分
Bearer和token时加入异常处理,避免因为头格式不正确导致服务报错。 - 如果要正式实现JWT验证,需要引入
PyJWT库,在拿到token后进行解码和签名验证。
内容的提问来源于stack exchange,提问作者Lëmön
相关产品推荐
相关产品推荐

