CURL 系列(8.3) —— HTTP 认证

CURL 系列(8.3) —— HTTP 认证

原文: Authentication · Everything curl - HTTP authentication

每个 HTTP 请求, 都可以被认证. 如果一个服务器或者一个代理想要让用户证明自己有权限去访问某个 URL 或者执行某个操作, 它可以返回一个 HTTP 请求, 让客户端提供一个包含了正确的 HTTP 认证头的请求, 以便认证和允许访问.

如果一个服务器需要认证才能进行访问的话, 会返回 401 码, 以及一个 WWW-Authenticate: 头, 这个头里包含了服务器支持的所有类型的认证方式.

如果一个 HTTP 代理需要认证的话, 会返回 407 码, 以及一个 Proxy-Authenticate: 头, 这个头里包含了代理支持的所有类型的认证方式.

值得一提的是, 当今的绝大多数网站已经不再需要 HTTP 认证来进行登录等等操作了, 但是取而代之的是, 网站会要求用户在网站的登录页上进行登录, 然后网站会把用户输入的用户名和密码以 POST 请求的方式发送给服务器, 随后客户端只需要维护着 cookie 来维护 session 即可.

为了让 curl 命令发起一个带有 HTTP 认证的请求, 你需要加上 -u 或者 --user 参数来提供用户名和密码(以冒号分隔). 就像下面这样:

1
curl --user daniel:secret http://example.com/

这样一来, curl 就会以 HTTP 认证中的 “Basic” 方式发起一个认证请求. Basic 方法就像它的名字一样, 真的是一种非常基础的认证. 如果你想非常明确的发出一个 Basic 方法的认证的话, 只需要加上 --basic 参数就可以了.

Basic 认证方法直接以文本的格式通过网络来发送用户名和密码了(不过是用 base64 编码过了), 然而这种 HTTP 明文发送用户名和密码的方式, 是应该避免的.

如果一定要通过 HTTP 传输、单认证方法的方式来进行认证的话, curl 会在第一个 HTTP 请求的头部里加上认证信息.

如果你想让 curl 试一下 服务器是否需要认证, 可以给 curl 加上一个 --anyauth 参数. 这样一来, curl 就会先发送一个请求, 看看是否需要认证, 如果需要认证, 再自动地选择服务器所支持的最为安全的方式进行认证:

1
curl --anyauth --user daniel:secret http://example.com/

这样的思路在其他类型的可能会需要认证的 HTTP 操作上, 也行得通:

1
2
curl --proxy-anyauth --proxy-user daniel:secret http://example.com/ \
--proxy http://proxy.example.com:80/

curl 一般来说会同时支持好几种认证方式(取决于你在用的 curl 是如何实现的), 包括 Digest, Negotiate 和 NTLM. 如果你想用这些方式的话, 可以像这样加上参数来使用:

1
2
3
curl --digest --user daniel:secret http://example.com/
curl --negotiate --user daniel:secret http://example.com/
curl --ntlm --user daniel:secret http://example.com/