- 计算机网络之Token、JWT
- 1.登录验证的方式
- 2.token定义
- 3.taken刷新
- 4.JWT跨域认证
- 5.JWT跨域认证起源
- 6.JWT原理
- 7.JWT的数据结构
- 7.1介绍
- 7.2Header
- 7.3Playload
- 7.4Signature
- 7.5Base64URL
- 8.JWT组成部分
- 9.JWT使用方式
- 10.JWT特点
- 11.传统身份验证的方法
- 12.基于 Token 的身份验证方法
- 11.JWT介绍
- 12.JWT认证流程
- 13.JWT组成
- 14.Authorization
- 15.WWW-Authenticate
- 16.HTTP Bearer认证
9.JWT使用方式 10.JWT特点 11.传统身份验证的方法一个JWT由三部分组成:
Header(头部) —— base64编码的Json字符串
Payload(载荷) —— base64编码的Json字符串
Signature(签名)—— 使用指定算法,通过Header和Payload加盐计算的字符串
各部分以" . "分割,如:
eyJhbGciOiJIUzUxMiJ9.eyJjcnQiOjE1MjgzNDM4OTgyNjgsImV4cCI6MTUyODM0MzkxOCwidXNlcm5hbWUiOiJ0b20ifQ.E-0jxKxLICWgcFEwNwQ4pfhdMzchcHmsd8G_BTsWgkUmVwPzDd7jJlf94cAdtbwTLMm27ouYYzTTxMXq7W1jvQ
直接通过base64解码可获得:
Header:
{“alg”:“HS512”}
Payload:
{“crt”:1528343898268,“exp”:1528343918,“username”:“tom”}
12.基于 Token 的身份验证方法传统身份验证的方法
HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。
解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。
上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。
11.JWT介绍使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
1.客户端使用用户名跟密码请求登录
2.服务端收到请求,去验证用户名与密码
3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
12.JWT认证流程实施 Token 验证的方法挺多的,还有一些标准方法,比如 JWT,读作:jot ,表示:JSON Web Tokens
在典型业务场景中,为了区分用户和安全保密,必须对API请求进行鉴权,
但是不能要求每一个请求都进行登录 *** 作。合理做法是,在第一次登录之后产生一个有一定有效期的tokn,并将其存储于浏览器的Cookie或LocalStorage之中,之后的请求都携带该token,请求到达服务器端后,服务器端用该tokn对请求进行鉴权。在第一次登录之后,服务器会将这个token用文件、数据库或缓存服务器等方法存下来,用于之后请求中的比对。或者,更简单的方法是,直接用密钥对用户信息和时间戳进行签名对称加密,这样就可以省下额外的存储,也可以减少每一次请求时对数据库的查询压力。这种方式,在业界已经有一种标准的实现方式,该方式被称为JSON Web Token(JWT,音同jot,详见JWT RFC7519)。
token的意思是“令牌”,里面包含了用于认证的信息。这里的token是指JSON Web Token(UWT)。
13.JWT组成1.客户端使用用户名和密码请求登录
2.服务端收到请求后会去验证用户名和密码,如果用户名和密码跟数据库记录不一致则验证失败,如果一致则验证通过,服务端会签发一个Token返回给客户端
3.客户端收到请求后会将Token缓存起来,比如放在浏览器Cookie中或者本地存储中,之后每次请求都会携带该Token
4.服务端收到请求后会验证请求中携带的Tokn,验证通过则进行业务逻辑处理并成功返回数据
在JWT中,Token有三部分组成,中间用.隔开,并使用Base64编码:
header
payload
signature
如下是JWT中的一个Token示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1MjgwMTY5MjIsImlkIjowLCJuYmYiOjE1MjgwMTY5MjIsInVzZXJuYW1lIjoiYWRtaW4ifQ.LjxrK9DuAwAzUD8-9v43NzWBN7HXsSLfebw92DKd1JQ
header介绍
JWT Token的header中,包含两部分信息:
1.Token的类型
2.Token所使用的加密算法
例如:
{
“typ”: “JWT”,
“alg”: “HS256”
}
该例说明Token类型是WT,加密算法是HS256(lg算法可以有多种)。
上面的内容要用 Base64 的形式编码一下,所以就变成这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload载荷介绍
Payload中携带Token的具体内容,里面有一些标准的字段,当然你也可以添加额外的字段,来表达更丰富的信息,可以用这些信息来做更丰富的处理,比如记录请求用户名,标准字段有:
1.iss:JWT Token的签发者
2.Sub:主题
3.exp:JWT Token过期时间
4.aud:接收WT Token的一方
5.iat:WT Token签发时间
6.nbf:JWT Token生效时间
7.jti:JWT Token ID
比如下面这个 Payload ,用到了 iss 发行人,还有 exp 过期时间。另外还有两个自定义的字段,一个是 name ,还有一个是 admin 。
{
“iss”: “ninghao.net”,
“exp”: “1438955445”,
“name”: “wanghao”,
“admin”: true
}
使用 Base64 编码以后就变成了这个样子:
eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ
header
payload
secret
Signature签名介绍
JWT 的最后一部分是 Signature ,Signature是Token的签名部分,这部分内容有三个部分,把用 Base64 编码的 header.payload与header再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端,加密后的内容即为Signature
注:一般通过配置文件来配置Secret的值,通常配置在conf/config.yaml配置文件中
var encodedString = base64UrlEncode(header) + “.” + base64UrlEncode(payload);
HMACSHA256(encodedString, ‘secret’);
处理完成以后看起来像这样:
SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
14.Authorization最后这个在服务端生成并且要发送给客户端的 Token 看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
签名后服务端会返回生成的Token,客户端下次请求会携带该Token,服务端收到Token后会解析出header.payload,然后用相同的加密算法和密码对header.payload再进行一次加密,并对比加密后的Token和收到的Token是否相同,如果相同则验证通过,不相同则返回HTTP401 Unauthorized的错误。
http认证根据凭证协议的不同,划分为不同的方式。常用的方式有:
HTTP基本认证
HTTP摘要认证
HTTP Bearer认证
本篇文章介绍HTTP Bearer认证。
下面通过图详细的了解下HTTP Bearer认证过程:
Bearer认证也是http协议中的标准认证方式,在Bearer认证中的凭证称为Bearer_token 或者Access_token。该种方式的优点就是灵活方便,因为凭证的生成和验证完全由开发人员设计和实现。一般凭证的设计尽量能保证以下几点:
1.用户信息安全性,即保证重要信息不被泄露和恶意破解
2.避免重放攻击
3.更方便的适应更多的应用场景,主要体现在在服务端不需要凭证状态保存,分布式场景中,不需要状态共享
4.少查库,减少服务端负担。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)