我使用Apigility有一个非常简单的REST服务,暴露了GET和POST方法。我用Postman测试它。一切正常。
然后我尝试添加身份验证层。为此,我创建了一个htpasswd文件,我创建了一个通过Apigility接口指向该文件的Basic Auth适配器,并在我的API的设置页面上选择了该身份验证类型。
我最终选择为POST请求添加授权请求,而不是GET。
当我尝试发帖时,我要求输入登录名和密码,输入与htpasswd文件内容匹配的内容,生成Authorization标头,POST工作正常。
但是当我尝试在没有Authorization标头的情况下发出GET请求时,我仍然要求输入登录名和密码。如果我取消,我会收到401状态代码(未经授权)。
据我所知,如果没有设置授权标头," guest" Apigility使用模式,因为GET方法不需要身份验证,所以我不必输入登录名和密码来访问我的资源。
我哪里出错了?我没理解什么?
由于
答案 0 :(得分:2)
你刚刚提到你在Postman做过这件事,我认为这就是问题所在。
HTTP身份验证具有" pre-auth"阶段,如果没有凭据,则在响应中包含WWW-Authenticate
标头。对于机器客户端(cURL,HTTPie,基于语言的客户端等),只要状态代码不是401或403,就会忽略它。
但是,在基于浏览器的客户端(例如Postman)中,当浏览器遇到此类标头时,他们通常会发出身份验证质询,并在取消时发送空凭据。当然,这意味着授权标头与无效凭证一起发送,导致您的401。
尝试使用CLI中的cURL或HTTPie;你应该在那里看到非常不同的行为。
答案 1 :(得分: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
。