虽然401 Unauthorized
这些看起来很漂亮(“访问令牌丢失或无效”),但它可以抛出许多客户端 HTTP 堆栈来提示用户输入凭据,这无论如何都不会成功,因为正常的 HTTP 身份验证机制不起作用。
虽然我可以绕道使用另一个我可以指示不要尝试自动身份验证或用户提示(并且已经这样做)的客户端库,但据我所知,这似乎违反了RFC 7235 。
我怀疑 a403 Forbidden
在这里会更合规,对 API 用户的痛苦更少。他们中的大多数可能只是看到任何非 2XX 状态并立即运行以查找 JSON“错误”响应体。
我绕道而行,所以我没有抱怨,但这里似乎有些可疑。我肯定错过了什么吗?现在以401
这种方式将 REST 用于类似 REST 的 HTTP API 是一种常见的做法吗?
更多详情
只要使用了正确的身份验证令牌,这就会起作用,但如果使用了错误的令牌,则会导致用户/密码的 GUI 提示:
Set JsonBag = PBConfig.CloneItem("CreatePushJson") 'Make a deep copy of template JSON.
With JsonBag
.Item("title") = txtTitle.Text
.Item("body") = txtBody.Text
End With
With XMLHTTP
.abort 'Clean up previously failed request if any.
.open "POST", PBConfig.Item("CreatePushUrl"), True
.setRequestHeader "Access-Token", PBConfig.Item("AccessToken")
.setRequestHeader "Content-Type", "application/json"
.onreadystatechange = SinkRSChange
.send JsonBag.JSON
End With
如果提示被用户取消,则将401
报告给代码。
根据以下信息,我尝试将身份验证令牌作为用户 ID 值发送。但是,即使身份验证令牌正确,这也会引发提示:
Set JsonBag = PBConfig.CloneItem("CreatePushJson") 'Make a deep copy of template JSON.
With JsonBag
.Item("title") = txtTitle.Text
.Item("body") = txtBody.Text
End With
With XMLHTTP
.abort 'Clean up previously failed request if any.
.open "POST", PBConfig.Item("CreatePushUrl"), True, PBConfig.Item("AccessToken")
.setRequestHeader "Content-Type", "application/json"
.onreadystatechange = SinkRSChange
.send JsonBag.JSON
End With
如果用户手动将有效的身份验证令牌作为用户 ID 输入到提示中,则请求成功。
根据以下新信息
这可以通过显式发送"."
密码来实现:
Set JsonBag = PBConfig.CloneItem("CreatePushJson") 'Make a deep copy of template JSON.
With JsonBag
.Item("title") = txtTitle.Text
.Item("body") = txtBody.Text
End With
With XMLHTTP
.abort 'Clean up previously failed request if any.
.open "POST", PBConfig.Item("CreatePushUrl"), True, PBConfig.Item("AccessToken"), "."
.setRequestHeader "Content-Type", "application/json"
.onreadystatechange = SinkRSChange
.send JsonBag.JSON
End With
正确的令牌值有效,错误的令牌值返回401
可以处理的位置。现在没有凭据提示对话框。