下面是 wget 的命令和响应,它第一次不使用提供的用户名和密码并得到 401,后来它使用 auth 并得到 200。
这对于 curl 很有效,但通过 Postman 也会发生同样的事情,这是什么现象以及为什么会发生?
$> wget 'http://userName:password@host:port/v1/api'
--2018-08-31 16:06:01-- http://userName:password@host:port
Connecting to host:port... connected.
HTTP request sent, awaiting response... 401 Unauthorized
Authentication selected: Basic realm="myApp", API-Key realm="myApp"
Reusing existing connection to host:port.
HTTP request sent, awaiting response... 200 OK
Length: 146 [application/json]
Saving to: 'api'
api 100%[==================================================================================================================>] 146 --.-KB/s in 0s
2018-08-31 16:06:01 (9.28 MB/s) - 'api' saved [146/146]
答案1
wget
并且大多数其他程序都要求基本身份验证挑战在发送凭证之前从服务器端获取。
这是wget
自 1.10.2 版本以来的默认行为。
您可以使用选项更改该行为--auth-no-challenge
:
如果给出这个选项,Wget 将为所有请求发送基本 HTTP 身份验证信息(纯文本用户名和密码),就像 Wget 1.10.2 及之前版本默认做的那样。
不建议使用此选项,其目的仅用于支持一些不知名的服务器,这些服务器从不发送 HTTP 身份验证挑战,但除了基于表单的身份验证之外,还接受未经请求的身份验证信息。
这是 HTTP 身份验证的一般默认工作流程: