1. 前言
之前我讲解了如何编写一个自己的 Jwt 生成器以及如何在用户认证通过后返回 Json Web Token 。今天我们来看看如何在请求中使用 Jwt 访问鉴权。DEMO 获取方法在文末。
2. 常用的 Http 认证方式
我们要在 Http 请求中使用 Jwt 我们就必须了解 常见的 Http 认证方式。
2.1 HTTP Basic Authentication
HTTP Basic Authentication 又叫基础认证,它简单地使用 Base64
算法对用户名、密码进行加密,并将加密后的信息放在请求头 Header 中,本质上还是明文传输用户名、密码,并不安全,所以最好在 Https 环境下使用。其认证流程如下:
客户端发起 GET 请求 服务端响应返回 401 Unauthorized, www-Authenticate
指定认证算法,realm
指定安全域。然后客户端一般会弹窗提示输入用户名称和密码,输入用户名密码后放入 Header 再次请求,服务端认证成功后以 200 状态码响应客户端。
2.2 HTTP Digest Authentication
为弥补 BASIC 认证存在的弱点就有了 HTTP Digest Authentication 。它又叫摘要认证。它使用随机数加上 MD5 算法来对用户名、密码进行摘要编码,流程类似 Http Basic Authentication ,但是更加复杂一些:
步骤1:跟基础认证一样,只不过返回带 WWW-Authenticate
首部字段的响应。该字段内包含质问响应方式认证所需要的临时咨询码(随机数,nonce
)。 首部字段WWW-Authenticate
内必须包含 realm
和 nonce
这两个字段的信息。客户端就是依靠向服务器回送这两个值进行认证的。nonce
是一种每次随返回的 401 响应生成的任意随机字符串。该字符串通常推荐由 Base64 编码的十六进制数的组成形式,但实际内容依赖服务器的具体实现
步骤2:接收到 401 状态码的客户端,返回的响应中包含 DIGEST 认证必须的首部字段 Authorization
信息。首部字段 Authorization
内必须包含username、realm、nonce、uri
和 response
的字段信息,其中,realm
和 nonce
就是之前从服务器接收到的响应中的字段。
步骤3:接收到包含首部字段 Authorization 请求的服务器,会确认认证信息的正确性。认证通过后则会返回包含 Request-URI 资源的响应。
并且这时会在首部字段 Authorization-Info 写入一些认证成功的相关信息。
2.3 SSL 客户端认证
SSL 客户端认证就是通常我们说的 HTTPS 。安全级别较高,但需要承担 CA 证书费用。SSL 认证过程中涉及到一些重要的概念,数字证书机构的公钥、证书的私钥和公钥、非对称算法(配合证书的私钥和公钥使用)、对称密钥、对称算法(配合对称密钥使用)。