【问题标题】:BasicAuth Prompt won't show with Status 401BasicAuth 提示不会显示状态 401
【发布时间】:2013-01-09 02:38:19
【问题描述】:

即使我使用 Tornado 发送 401 状态代码,我也没有在 IE/Firefox 中看到密码提示:-

import tornado.ioloop
import tornado.web

class UserHandler(tornado.web.RequestHandler):
    def get(self, user_id):
        self.set_header('WWW-Authenticate', 'Basic realm="users"')
        self.send_error(status_code=401)

application = tornado.web.Application([
    (r"/users/(\w+)", UserHandler),
],debug=True)

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

此外,WWW-Authenticate 标头不会显示在响应标头中。当我不发送 401 状态时,它确实显示在标题中,但它仍然不显示密码提示。

【问题讨论】:

    标签: python http http-headers tornado basic-authentication


    【解决方案1】:

    虽然我不知道为什么,但这有效。

    import tornado.ioloop
    import tornado.web
    
    class UserHandler(tornado.web.RequestHandler):
        def get(self, user_id):
            self.set_status(401)
            self.set_header('WWW-Authenticate', 'Basic realm=Users')
    
    application = tornado.web.Application([
        (r"/users/(\w+)", UserHandler),
    ],debug=True)
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    

    【讨论】:

      【解决方案2】:

      您找到的解决方案(使用set_status() 而不是send_error())有效,因为send_error() 调用clear(),它“[r] 设置所有标题和内容”,如the source 所示。然后它会调用write_error() 根据状态码发送新的内容和标头。

      如果您可以通过手动(或使用您自己的方法)设置所有内容和标题来处理错误,请不要使用send_error()

      我发现你也可以修改RequestHandler 的方法,让send_error() 为你工作而不是对你不利。 WWW-Authenticate 标头是任何401 响应的预期部分,所以如果send_error(401) 会自动添加它会很好。这可以通过覆盖write_error()来完成:

      class BaseHandler(RequestHandler):
          def write_error(self, status_code, **kwargs):
              if status_code == 401:
                  self.add_header(
                      'WWW-Authenticate',
                      'Basic realm=' + json.dumps(self.realm))  # adds quotes
              super(BaseHandler, self).write_error(status_code, **kwargs)
      
      class UserHandler(BaseHandler):
          realm = 'Users'
          # ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-19
        • 1970-01-01
        • 2021-08-31
        • 2016-04-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        相关资源
        最近更新 更多