应该使用什么 http 状态代码来告诉客户端会话已超时?
在网页中,它使用YUI连接管理器/数据源向服务器发送AJAX请求,如果会话(包含有关用户是否已通过身份验证的信息)已经超时,则只能由经过身份验证的用户查看的ajax响应应返回http状态代码,告诉客户端会话已超时, 然后客户端要么简单地将他重定向到登录页面,要么询问他是否要延长会话。
我的问题是,在这种情况下,哪种http状态代码最适合告诉客户端会话已超时?
在网页中,它使用YUI连接管理器/数据源向服务器发送AJAX请求,如果会话(包含有关用户是否已通过身份验证的信息)已经超时,则只能由经过身份验证的用户查看的ajax响应应返回http状态代码,告诉客户端会话已超时, 然后客户端要么简单地将他重定向到登录页面,要么询问他是否要延长会话。
我的问题是,在这种情况下,哪种http状态代码最适合告诉客户端会话已超时?
我能建议的最好的是带有WWW-Authenticate标头的HTTP 401状态代码。
403 请求的问题在于 RFC 2616 指出“授权无济于事,请求不应重复”。(即,无论您是否经过身份验证都无关紧要,您将永远无法访问该资源)。
401 请求的问题在于它声明它们“必须包含 WWW-Authenticate 标头字段”。正如有人所指出的那样,在WWW-Authenticate标头中使用自定义值似乎并不违反规范。
我看不出RFC 2617中的任何原因,为什么HTTP 401状态与像这样的自定义WWW-Authenticate标头相结合是不行的:
WWW-Authenticate: MyAuthScheme realm="http://example.com"
oAuth规范实际上似乎就是这样做的,因为他们推荐这个(尽管在我看来,他们对RFC有一个奇怪的解释):
WWW-Authenticate: OAuth realm="http://server.example.com/"
这似乎不是RFC特别批准的,但我实际上看不到它被它禁止(它似乎与任何必须或不能,应该或不应该的条件相冲突)。
我希望有一个更具体的HTTP状态代码用于超时和CSRF令牌无效之类的事情,所以这更清楚。
我会推荐一个HTTP 401。
403基本上说,“你不被允许,走开,不要回来”,而401说,“我们不知道你是否被允许,因为你没有带你的身份证。去拿它,再试一次。
比较维基百科的定义:
HTTP 403 - 该请求是合法请求,但服务器拒绝响应它。
HTTP 401 - 与 403 禁止访问类似,但专门用于身份验证可能但已失败或尚未提供时使用。