认证0级讲师
1.首先你要知道koa-jwt的功能,目前只提供了decode, sign和verify的功能,你说的判断token过期koa-jwt module没有专门提供函数来验证。
koa-jwt
decode
sign
verify
token
2.那如何判断token过期了呢? 先简单和你介绍一下jwt,然后再教你如何判断过期。
jwt
2.1 jwt简介
JSON Web Token(jwt) 在网页中,许多操作都需要验证用户权限,判断用户是否登陆等。一般有两种实现方式: 一种是通过session和cookie; 另一种就是用鉴权token。利用token来鉴权主要有以下两个优势。
session
cookie
服务端不需要请求DB来获取用户信息,因为用户信息已经存在token里面。
token鉴权的方式对移动端和PC端同样适用,服务端不需要维护两套鉴权机制。
一个标准的jwt是由3部分组成 <header>, <payload> 和 <signature>
<header>
<payload>
<signature>
Header: base64编码的json object, 包括使用的加密算法等。
Payload: base64编码的json object, 存储用户相关的信息。
Signature: 根据Header,PayloadA 和一个密钥(只有服务端知道),并利用Header中指定的加密算法,生成的一个签名串。
2.2 如何判断失效
判断token过期有许多方法,我这里列出几种供你选择
jwt 提供了过期参数设置,在签发token的时候(koa-jwt调用sign的时候),在Payload里面设置exp属性,这是jwt提供的Registered Claims(保留声明), 记住一定要比当前时间大才行,如设置成当前时间之后10分钟过期
exp
Registered Claims
{ exp: Date.now()+10*60*1000, }
然后你可以持久化存储到你的localstorage, sessionStorage或者cookie里面,这个token通过请求传到服务端,验证(调用koa-jwt的verify的时候)的时候就会报TokenExpiredError
持久化
TokenExpiredError
Thrown error if the token is expired. Error object: - name: 'TokenExpiredError' - message: 'jwt expired' - expiredAt: [ExpDate]
服务端生成token之后,你可以在请求的返回里面,把这个token存到cookie(或者sessionStorage)里面, 然后设置这个cookie的过期时间expire, 这样下次请求你在你的请求的header或者body里面拿不到token的时候就知道token过期了(和你提供的代码类似,不过记得设置存储token的这个cookie的过期时间)。
expire
header
body
自定义类似exp的属性,因为exp是保留属性,所以你可以设置一个origin-iat上次颁发的时间,然后持久化存储,之后解出token之后,判断当前时间和origin-iat的时间差有没有达到你的过期时间,达到了就重新要求鉴权,重新颁发token, 伪代码如下
origin-iat
var profile = jwt.verify(req.header.token || req.body.token, secret); // if more than 7 days old, force login if (Date().now() - profile.original_iat > 7 * 24 * 60 * 60 * 1000) { // iat == issued at return res.status(401).json({ isError: true, error: { message: 'Access Forbidden'}}); // re-logging }
几种方式的区别是: 第一种和第三种方式通过请求可以一直取到token,但是token可能是过期的。 第二种方式是通过请求可能获取不到token。 你自己可以根据你的业务需求做出合适的选择。
附: JSON Web Token Specification RFC 7519
1.首先你要知道
koa-jwt
的功能,目前只提供了decode
,sign
和verify
的功能,你说的判断token
过期koa-jwt
module没有专门提供函数来验证。2.那如何判断
token
过期了呢? 先简单和你介绍一下jwt
,然后再教你如何判断过期。2.1
jwt
简介JSON Web Token(
jwt
) 在网页中,许多操作都需要验证用户权限,判断用户是否登陆等。一般有两种实现方式: 一种是通过session
和cookie
; 另一种就是用鉴权token
。利用token
来鉴权主要有以下两个优势。服务端不需要请求DB来获取用户信息,因为用户信息已经存在token里面。
token鉴权的方式对移动端和PC端同样适用,服务端不需要维护两套鉴权机制。
一个标准的jwt是由3部分组成
<header>
,<payload>
和<signature>
Header: base64编码的json object, 包括使用的加密算法等。
Payload: base64编码的json object, 存储用户相关的信息。
Signature: 根据Header,PayloadA 和一个密钥(只有服务端知道),并利用Header中指定的加密算法,生成的一个签名串。
2.2 如何判断失效
判断token过期有许多方法,我这里列出几种供你选择
jwt 提供了过期参数设置,在签发token的时候(koa-jwt调用sign的时候),在Payload里面设置
exp
属性,这是jwt提供的Registered Claims
(保留声明), 记住一定要比当前时间大才行,如设置成当前时间之后10分钟过期然后你可以
持久化
存储到你的localstorage, sessionStorage或者cookie里面,这个token通过请求传到服务端,验证(调用koa-jwt的verify的时候)的时候就会报TokenExpiredError
服务端生成token之后,你可以在请求的返回里面,把这个token存到cookie(或者sessionStorage)里面, 然后设置这个cookie的过期时间
expire
, 这样下次请求你在你的请求的header
或者body
里面拿不到token的时候就知道token过期了(和你提供的代码类似,不过记得设置存储token的这个cookie的过期时间)。自定义类似
exp
的属性,因为exp
是保留属性,所以你可以设置一个origin-iat
上次颁发的时间,然后持久化存储,之后解出token之后,判断当前时间和origin-iat
的时间差有没有达到你的过期时间,达到了就重新要求鉴权,重新颁发token, 伪代码如下几种方式的区别是: 第一种和第三种方式通过请求可以一直取到token,但是token可能是过期的。 第二种方式是通过请求可能获取不到token。 你自己可以根据你的业务需求做出合适的选择。
附: JSON Web Token Specification RFC 7519