RFC 7235 定义了一个HTTP身份验证框架。服务器向客户端发送请求质询,客户端提供身份验证凭证。工作流程如下:服务器端向客户端返回 401(Unauthorized,未被授权的) 状态码,并在 WWW-Authenticate首部提供如何进行验证的信息,其中至少包含有一种质询方式。之后有意向证明自己身份的客户端可以在新的请求中添加 Authorization 首部字段进行验证,字段值为身份验证凭证信息。通常客户端会弹出一个密码框让用户填写,然后发送包含有恰当的 Authorization 首部的请求。

authentication 身份认证 - 图1

状态码

401

Unauthorized 客户端错误,缺乏目标资源要求的身份验证凭证,发送的请求未得到满足。
这个状态码会与 WWW-Authenticate 首部一起发送,其中包含有如何进行验证的信息。

  1. HTTP/1.1 401 Unauthorized
  2. Date: Wed, 21 Oct 2015 07:28:00 GMT
  3. WWW-Authenticate: Basic realm="Access to staging site"

403

Forbidden 客户端错误,服务器端有能力处理该请求,但是拒绝授权访问。

  1. HTTP/1.1 403 Forbidden
  2. Date: Wed, 21 Oct 2015 07:28:00 GMT

407

Proxy Authentication Required 客户端错误,由于缺乏位于浏览器与可以访问所请求资源的服务器之间的代理服务器(proxy server)要求的身份验证凭证,发送的请求尚未得到满足。
这个状态码会与 Proxy-Authenticate 首部一起发送,其中包含有如何进行验证的信息。

  1. HTTP/1.1 407 Proxy Authentication Required
  2. Date: Wed, 21 Oct 2015 07:28:00 GMT
  3. Proxy-Authenticate: Basic realm="Access to internal site"

WWW-Authenticate 与 Proxy-Authenticate

这两个响应消息首部指定了身份验证的方法,他们需要明确要进行验证的方案,这样进行授权的客户端就知道如何提供身份凭证信息。

  1. WWW-Authenticate: <type> realm=<realm>
  2. Proxy-Authenticate: <type> realm=<realm>

指的是验证方案。
realm 进行保护的区域或范围。

Authorization 与 Proxy-Authorization 首部

请求消息首部,用来向(代理)服务器证明用户代理身份的凭证。

  1. Authorization: <type> <credentials>
  2. Proxy-Authorization: <type> <credentials>

指的是验证方案。
根据验证方案进行编码或加密的凭证信息。

验证方案

IANA维护了 一系列的验证方案 ,Amazon AWS提供了一些验证方案, 常见的验证方案包括:

  • Basic:base64编码凭证,不安全,应与HTTPS/TLS协议搭配使用
  • Bearer:bearer令牌通过OAuth2.0保护资源
  • Diegest:md5 、SHA加密

参考

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication
http://qnimate.com/understanding-http-authentication-in-depth/