在一个网页,它使用YUI连接管理器/数据源,以AJAX请求发送到服务器,如果(包含用户是否已经认证的信息)会话已经超时,只能通过认证查看这些Ajax响应用户应该返回一个HTTP状态代码,告诉客户端会话已经超时,那么客户端或者简单重定向他到登录页面,或问他,如果他想延长会议。
我的问题是,在这种情况下,什么样的HTTP状态代码是最合适的,告诉客户端的会话超时?
最好的我可以建议是一个HTTP 401状态码与WWW-Authenticate头。
与403所请求的问题是在RFC 2616状态“授权不会帮助和请求不应该重复。” (即不要紧,如果你验证过了,你是不是会得到访问该资源,永远)。
与401所请求的问题是它指出,他们“必须包含一个WWW-Authenticate头场”。作为someone has noted它似乎并没有违反该规范的WWW-Authenticate头使用自定义的值。
我看不到任何理由RFC 2617为什么一个HTTP 401状态用一个自定义的WWW-Authenticate头这样的合并没有好:
WWW-Authenticate: MyAuthScheme realm="http://example.com"
该oAuth spec实际上似乎只做这一点,因为他们推荐这个(虽然他们使我想起了RFC的奇解释):
WWW-Authenticate: OAuth realm="http://server.example.com/"
这似乎不是由RFC具体制裁,但我不能真正看到它是由它禁止(它似乎并不冲突与任何必须或不能,该不该条件)。
我希望能有一个更具体的HTTP状态代码的超时和喜欢的事情CSRF令牌是无效所以这是更清晰。
对于非Ajax请求,我使用302重定向。
对于Ajax请求,我用200已知错误。这样我可以把数据对象的优势。我找到的数据对象更容易比分析jqXHR对信息的工作。然后我就不需要担心什么HTTP状态代码,试图重新宗旨,为我的处境。
jQuery的实施例:
$.ajax({
//send data to server
})
.done(function(data, textStatus, jqXHR) {
if (data.success) {
//then process return data
}
else {
//get error type or message from data object
//could use custom error codes
}
})
.fail(function(jqXHR, textStatus, errorThrown) {
//handle unknown errors
});
我会建议一个HTTP 401。
而403基本上说,“你不允许的,走不回来”,401说,“我们不知道,如果你允许或不是因为你没带身份证。去得到它,然后再试一次。”
HTTP 403 - 请求是合法的请求,但服务器拒绝对此作出回应。
HTTP 401 - 类似于403禁止,但专为使用在认证是可能的但发生故障或尚未提供。
约419什么 - 它不是标准,而是description on Wikipedia似乎适合:
419验证超时
不是HTTP标准的一部分,419验证超时表示先前有效的认证已过期。它被用来作为一种替代401未授权的顺序,否则验证客户端来区分被拒绝访问特定的服务器资源。
我认为适当的代码将是403 /禁止。有没有任何直接相关的会议。
事实是,有一个会话超时没有标准的HTTP状态代码。会话在应用层,而不是HTTP传输层中实现。
目前,微软已经使用了会话超时自定义状态码:599,或仅仅弥补在5XX范围内自己的状态代码。
从状态代码的Wiki:
599网络连接超时错误(未知)此状态码不以任何RFC中指定,而是使用由微软公司HTTP代理发信号通知网络中的代理前面的代理之后超时连接到客户端。
我用的是自定义状态码599会话超时,然后在Ajax响应进行检查。
按照由波波上面提供Http Status Codes的维基百科链接:
440 Login Timeout (Microsoft)
A Microsoft extension. Indicates that your session has expired.
当你发布一个链接,该链接,我发现这个HTTP状态代码440,您可以使用440 HTTP状态代码会话过期。
440登录超时
The client's session has expired and must log in again.
401未授权的情况下,用户登录证书是错误的,我们可以使用。或在头中传递的身份验证令牌无效。
403禁止我们可以用这个当用户不具有请求的资源特定的权限。
所以在我看来,我们应该使用440登录超时。
技术上,公认的答案是正确的:如果你已经确切知道你将要失败的请求,你问哪个故障代码返回,然后HTTP 401“未授权(未经身份验证)”是一个合适的,所以以提示重新验证。
但首先,问自己:你应该请求失败?
考虑到用户可能简单地访问您的网站的公共页面,在这种情况下,你会被他们拍打在脸上用“未授权”!消息,并要求重新进行身份验证,才能看到一个页面,他们通常能够看到不进行认证。这不是很酷。
我的建议是忽略的事实是会话令牌是未知的,只是继续生成一个新的会话令牌,并为它创建一个新的会话。当然,本次会议的初始状态将是“还未完成认证”,因此,如果用户试图访问一个非公开页面,则该页面会看到它,他们收到一个HTTP 401“未授权(未经身份验证) “必须进行身份验证。但是,如果用户登陆一个公共页面上,他们不会注意到有什么不同。
我会用302重定向响应,以“位置”头重定向到像资源路径“/ AUTH-需要”
客户端可以路线与登录/密码形式的模态资源路径,避免转院用户到另一个页面。