2

我有一个使用 Apigility 的非常简单的 REST 服务,公开 GET 和 POST 方法。我使用 Postman 对其进行测试。一切正常。

然后我尝试添加一个身份验证层。为此,我创建了一个 htpasswd 文件,我通过 Apigility 接口创建了一个指向该文件的基本身份验证适配器,并在我的 API 的设置页面上选择了该身份验证类型。

我最终选择为 POST 请求添加授权请求,而不是 GET。

当我尝试发帖时,我被要求输入登录名和密码,我键入与 htpasswd 文件内容匹配的那个,生成授权标头并且 POST 工作得很好。

但是当我尝试在没有 Authorization 标头的情况下发出 GET 请求时,仍然会要求我输入登录名和密码。如果我取消,我会收到 401 状态码(未授权)。

据我了解,如果没有设置 Authorization 标头,Apigility 使用“访客”模式,并且由于 GET 方法不需要身份验证,我不应该输入登录名和密码来访问我的资源.

我哪里做错了?我没听懂什么?

谢谢

4

2 回答 2

2

您刚刚提到您在 Postman 中执行此操作,我认为这就是问题所在。

HTTP 身份验证有一个“预身份验证”阶段,如果没有凭据,它会WWW-Authenticate在响应中包含一个标头。对于机器客户端(cURL、HTTPie、基于语言的客户端等),只要状态码不是 401 或 403,它就会被忽略。

但是,在Postman 等基于浏览器的客户端中,当浏览器遇到此类标头时,它们通常会发出身份验证质询,并在取消时发送空凭据。当然,这意味着使用无效凭据发送授权标头,导致您的 401。

尝试从 CLI 使用 cURL 或 HTTPie;你应该在那里看到非常不同的行为。

于 2015-07-09T14:17:33.540 回答
0

您可能只需要更新您的配置并设置哪些方法需要和不需要身份验证。

检查您的配置以获取以下配置:

[
    'zf-mvc-auth' => [
        'authorization' => [
            'Your\Controller' => [
                'collection' => array(
                    'default' => true,
                    'GET' => true,
                    'POST' => true,
                    // etc.
                ),
                'entity' => array(
                    'default' => true,
                    'GET' => true,
                    'POST' => true,
                    // etc.
                ),
            ]
        ]
    ]
]

您需要将无需身份验证允许的方法设置为false.

于 2015-04-29T18:39:56.080 回答