因为HTTP协议是开放的,可以任人调用。所以,如果接口不希望被随意调用,就需要做访问权限的控制,认证是好的用户,才允许调用API。
Bearer Token(Token 令牌)
定义:为了验证使用者的身份,需要客户端向服务器端提供一个可靠的验证信息,称为Token,这个token通常由Json数据格式组成,通过hash散列算法生成一个字符串,所以称为Json Web Token(Json表示令牌的原始值是一个Json格式的数据,web表示是在互联网传播的,token表示令牌,简称JWT)
Bearer验证也属于HTTP协议标准验证,它随着OAuth协议而开始流行。Bearer验证中的凭证称为BEARER_TOKEN,或者是access_token,它的颁发和验证完全由我们自己的应用程序来控制,而不依赖于系统和Web服务器,Bearer验证的标准请求方式如下:
Authorization:Bearer [BEARER_TOKEN]
Bearer认证,其核心便是BEARER_TOKEN,而最流行的Token编码方式便是:JSON WEB TOKEN(JWT)。Json Web Token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
jwt主要包含以下三个内容:
- 头部 Header
- 载荷 Payload
- 签名 Signature
头部(Header)
{ "alg": "HS256", "typ": "JWT" }
alg是所使用的hash算法,如:SHA256、HMAC SHA256或RSA,HMAC(Hash Message Authentication Code,散列消息鉴别码);typ是Token的类型,在这里就是:JWT。
然后使用Base64Url编码成第一部分
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..
载荷(Payload)
这一部分是JWT主要的信息存储部分,其中包含了许多种的声明(Claims)。
Claims的实体一般包含用户和一些元数据,这些Claims分成三种类型:
- reserved claims:预定义的一些声明,并不是强制的但是推荐,它们包括 iss (issuer), exp (expiration time),sub (subject),aud(audience) 等(这里都使用三个字母的原因是保证 JWT 的紧凑)。
- public claims: 公有声明,这个部分可以随便定义,但是要注意和 IANA JSON Web Token 冲突。
- private claims: 私有声明,这个部分是共享被认定信息中自定义部分。
一个简单的Payload可以是这样子的:
{ "user_name": "admin", "scope": [ "read","write","del" ], "organization": "admin", "exp": 1531975621, "authorities": [ "ADMIN" ], "jti": "23408d38-8cdc-4460-beac-24c76dc7629a", "client_id": "webapp" }
这部分同样使用Base64Url编码成第二部分
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
签名(Signature)
Signature是用来验证发送者的JWT的同时也能确保在期间不被篡改。
签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
首先,需要指定一个密码(secret)。该密码仅仅为保存在服务器中,并且不能向用户公开。然后,使用标头中指定的签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名。
使用Base64编码后的header和payload以及一个秘钥,使用header中指定签名算法进行签名。
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
结果:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-19
1.令牌的好处:避免在使用中不断的输入账号和密码,比较安全
2.如果要测试带token的接口,首先要进行登录,登录成功会有个token信息,向api接口发送请求的时候必须带上这个token,故需要做2次请求(1,登录,拿到token 2,正式对接口进行测试)
3.注意点:
1)token一般有时间限制。测试前需要跟开发确认token可以用多久,什么时候算token失效
2)token放在哪儿,怎么传回去,需要有开发文档,或者咨询开发,登录成功返回的token需要了解从什么地方获取(可以通过录制进行查看)
JWT的工作过程
客户端接收服务器返回的JWT,将其存储在Cookie或localStorage中。
此后,客户端将在与服务器交互中都会带JWT。如果将它存储在Cookie中,就可以自动发送,但是不会跨域,因此一般是将它放入HTTP请求的Header Authorization字段中。
Authorization: Bearer JWT_TOKEN
当跨域时,也可以将JWT被放置于POST请求的数据主体中。
- 通用:因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。
- 紧凑:JWT的构成非常简单,字节占用很小,可以通过 GET、POST 等放在 HTTP 的 header 中,非常便于传输。
- 扩展:JWT是自我包涵的,包含了必要的所有信息,不需要在服务端保存会话信息, 非常易于应用的扩展。