我有一个非常简单的 REST 服务,使用 Apigility,公开 GET 和 POST 方法。我用 postman 测试它。一切正常。
然后我尝试添加身份验证层。为此,我创建一个 htpasswd 文件,创建一个通过 Apigility 接口(interface)指向该文件的基本身份验证适配器,然后在 API 的设置页面上选择该身份验证类型。
我最终选择为 POST 请求添加授权请求,而不是 GET。
当我尝试发帖时,系统会要求我输入登录名和密码,我输入与 htpasswd 文件内容匹配的登录名和密码,生成授权 header ,并且 POST 效果很好。
但是当我尝试发出没有授权 header 的 GET 请求时,系统仍然要求我输入登录名和密码。如果我取消,我会收到 401 状态代码(未经授权)。
据我了解,如果没有设置授权 header ,则 Apigility 使用“访客”模式,并且由于 GET 方法不需要身份验证,因此我不必输入登录名和密码访问我的资源。
我哪里出错了?我哪里没理解错?
谢谢
最佳答案
您刚刚提到您正在 Postman 中执行此操作,我认为这就是问题所在。
HTTP 身份验证有一个“预身份验证”阶段,如果不存在凭据,它会在响应中包含一个 WWW-Authenticate
header 。对于机器客户端(cURL、HTTPie、基于语言的客户端等),只要状态代码不是 401 或 403,就会忽略这一点。
但是,在基于浏览器的客户端(例如 Postman)中,当浏览器遇到此类 header 时,它们通常会发出身份验证质询,并在取消时发送空凭据。当然,这意味着使用无效凭据发送授权 header ,从而导致 401。
尝试从 CLI 使用 cURL 或 HTTPie;您应该会看到非常不同的行为。
关于rest - 使用 Postman 时 Apigility 中的基本身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29940736/