基本身份验证不是无状态

时间:2014-07-10 14:10:43

标签: jquery cakephp

我正在尝试在CakePHP API中使用基本身份验证,我可以使用jQuery进行交流。

运行此代码可以正常运行:

$.ajax({
        type: 'GET',
        url: 'http://username:password@domain.com',
        dataType: 'jsonp',
        success: function(data) {
                console.log(data);
        }
});

注意:我将用户名和密码放在URL中,因为否则不会使用JSONP作为数据类型发送标头,然后使用beforeSend等

但是,然后运行此代码作为上面的AFLACEMENT运行上面的内容也可以(注意我不再发送用户名和密码)

$.ajax({
        type: 'GET',
        url: 'http://domain.com',
        dataType: 'jsonp',
        success: function(data) {
                console.log(data);
        }
});

浏览器正在记住用户,因此代码不再需要标头来向CakePHP API发出请求。但如果它是无国籍的......这应该不会发生吗?

我认为您必须将每个请求的标头发送到基本身份验证吗?

任何人都能解释一下吗?

2 个答案:

答案 0 :(得分:1)

在第一次请求期间,服务器实际在响应标头中发出WWW-Authenticate字段,并向您回复质询验证,要求您输入正确的用户名和密码。在您的情况下,您将它们包含在URL中。

下次再次向服务器发送请求时,客户端的请求标头现在将包含一个授权字段(即Authorization: Basic c2RmZ2RmZzpkYWRmZHNmcw==)。 c2RmZ2RmZzpkYWRmZHNmcw==基本上是一个基本64位编码的字符串,客户端将其包含在每个后续请求的标头中,这样服务器每次都不会使用质询验证进行响应。通过对字符串进行base 64解码,您将看到该值基本上是用户名和密码(即dfgdfg:dadfdsfs)的组合,格式为<username>:<password>

现在,如果您尝试关闭浏览器,授权字段将被销毁,一旦您再次尝试发出请求,服务器将再次询问正确的用户名和密码。实际上,您可以在纯文本中绕过URL中的用户名和密码。只需在请求标头中添加Authorization字段即可。只需确保:value是正确的64位编码,并包含类型Basic

答案 1 :(得分:0)

通过浏览器访问受保护的资源。

与普通身份验证一样,您的代码可能正在设置一个会话,该会话会记住用户后续请求。寻找cookie响应或添加完整代码。

还要记住,基本身份验证和http(没有SSL)是灾难的匹配,因为凭据将作为未加密请求的一部分发送。