Token认证-基于JWT
2018-03-22 15:33
281 查看
Token简介
一个Token就是一些信息的集合;在Token中包含足够多的信息,以便在后续请求中减少查询数据库的几率;
服务端需要对cookie 或 HTTP Authrorization Header进行Token信息的检查;
基于上一点,可以用一套token认证代码来面对浏览器类客户端和非浏览器类客户端;
因为token是被签名的,所以可以认为一个由我们系统发放的可以解码认证通过的token,其中带的信息是合法有效的;
Token 特点和优势
无状态在客户端存储的Tokens是无状态的。基于这种无状态和不存储Session信息,负载负载均衡器能够将用户信息从一个服务传到其他服务器上。如果我们将已验证的用户的信息保存在Session中,则每次请求都需要用户向已验证的服务器发送验证信息(称为Session亲和性)。用户量大时,可能会造成一些拥堵。
可扩展
Tokens能够创建与其它程序共享权限的程序。例如,能将一个任意的社交帐号和自己的大号(Fackbook或是Twitter)联系起来。当通过服务登录Twitter(我们将这个过程Buffer)时,我们可以将这些Buffer附到Twitter的数据流上。使用tokens时,可以提供可选的权限给第三方应用程序。当用户想让另一个应用程序访问它们的数据,我们可以通过建立自己的API,得出特殊权限的tokens。
跨程序调用
对应用程序和服务进行扩展的时候,需要介入各种各种的设备和应用程序,只要用户有一个通过了验证的token,数据和资源就能够在任何域上被请求到。
安全
请求中发送token而不再是发送cookie能够防止CSRF(跨站请求伪造)。即使在客户端使用cookie存储token,cookie也仅仅是一个存储机制而不是用于认证。
不将信息存储在Session中,让我们少了对session操作。 token是有时效的,一段时间之后用户需要重新验证。我们也不一定需要等到token自动失效,token有撤回的操作,通过token revocataion可以使一个特定的token或是一组有相同认证的token无效。
Token的验证原理
基于Token的身份验证是无状态的,我们不将用户信息存在服务器或Session中。这种概念解决了在服务端存储信息时的许多问题
不用Session意味着你的程序可以根据需要去增减机器,而不用去担心用户是否登录。
基于Token的身份验证的过程如下:
客户端使用用户名跟密码请求登录
服务端收到请求,去验证用户名与密码
验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
JWT
英文全称 JSON Web Tokens,是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。JWT的组成拥有以下三部分
header
payload
signature
三个部分中间用点分隔开
Header
header 部分主要是两部分内容,一个是 Token 的类型,另一个是使用的算法,比如下面类型就是 JWT,使用的算法是 HS256。{ "typ": "JWT", "alg": "HS256" }
上面的内容要用 Base64 的形式编码一下,所以就变成这样
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload
Payload里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段:iss:Issuer,发行者
sub:Subject,主题
aud:Audience,观众
exp:Expiration time,过期时间,这里是一个Unix时间戳
nbf:Not before 如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟;
iat:Issued at,发行时间
jti:JWT ID
比如下面这个 Payload ,用到了 iss 发行人,还有 exp 过期时间。另外还有两个自定义的字段,一个是 name ,还有一个是 admin 。
{ "iss": "ninghao.net", "exp": "1438955445", "name": "wanghao", "admin": true }
使用 Base64 编码以后
eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ
Signature
JWT 的最后一部分是 Signature ,这部分内容有三个部分,先是用 Base64 编码的 header.payload ,再用加密算法加密一下,加密的时候要放进去一个 Secret ,这个相当于是一个密码,这个密码秘密地存储在服务端。步骤如下:将 header的BASE64编码和payload的BASE64编码进行连接
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ
然后对连接的字符串进行HS256算法加密,处理后:
SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
最后整个Token会是这样
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc
参考资料
https://ninghao.net/blog/2834https://www.cnblogs.com/xiekeli/p/5607107.html
相关文章推荐
- 基于JWT的Token认证机制(一)
- JWT基于filter实现token的认证
- Laravel 5 中使用 JWT(Json Web Token) 实现基于API的用户认证
- 基于JWT前后端token认证
- 基于API的用户认证(OAuth2.0,JWT(json web token))了解
- ASP.NET WebApi 基于JWT实现Token签名认证(发布版)
- 基于web的认证机制(session,auth,token,JWT,认证防止攻击等)
- Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(json web token) 用户发送按照约定,向服务端发送 Header、Payload 和 Signature,
- 基于Token的WEB后台认证机制
- 基于Token的WEB后台认证机制
- 基于Token的WEB后台认证机制
- 基于Token的WEB后台认证机制
- 基于Token的WEB后台认证机制
- 基于Token的WEB后台认证机制
- 基于Token的WEB后台认证机制
- 基于Token的WEB后台认证机制
- WEB后台--基于Token的WEB后台登录认证机制(并讲解其他认证机制以及cookie和session机制)
- API接口JWT方式的Token认证(下),客户端(Android)的实现
- 基于token的多平台身份认证架构设计
- 使用 AngularJS & NodeJS 实现基于 token 的认证应用