您的位置:首页 > 其它

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/2834

https://www.cnblogs.com/xiekeli/p/5607107.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Token JWT