【问题标题】:Basic Authentication not stateless基本身份验证不是无状态的
【发布时间】:2014-07-10 14:10:42
【问题描述】:

我正在尝试在 CakePHP API 中使用基本身份验证,我可以使用 jQuery 与之交谈。

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

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

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

但是,在运行上述代码之后,运行此代码作为上述代码的替换也可以(请注意,我不再发送用户名和密码了)

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

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

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

谁能解释一下?

【问题讨论】:

    标签: jquery cakephp


    【解决方案1】:

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

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

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

    【讨论】:

    • 但是如果我刷新页面之前的请求应该被忘记吧?否则这不是无状态的。并且基本身份验证应该是无状态的。
    • HTTP 是无状态的,这就是为什么客户端需要一次又一次地发送 Authorization HTTP 标头字段。
    • 但是如果不在JS代码中为什么还要发送呢?即记住授权用户。
    【解决方案2】:

    应该以 API 的形式使其无状态,但这不是标准的强制性,因为基本身份验证可以与正常请求一起使用以获得通过浏览器访问受保护的资源。

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

    还请记住,Basic auth 和 http(没有 SSL)是灾难的匹配项,因为凭据将作为未加密请求的一部分发送。

    【讨论】:

    • 如何使 CakePHP 的基本身份验证无状态?因为我的印象不是会话(我已禁用)而是其他情况。
    • @Cameron 延迟响应,但如果您使用会话,则它不是无状态的。为了使其无状态,您必须每次都将所有详细信息传递给服务器。因此,通过关闭 cookie/会话,您自然应该拥有一个无状态系统。对于每个新请求,服务器应该不知道您是谁以及您之前在服务器上的位置。
    猜你喜欢
    • 2015-06-24
    • 2011-11-12
    • 2021-01-25
    • 2019-12-05
    • 2020-05-16
    • 2013-05-30
    • 2021-06-20
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多