node.js - koa-jwt如何使用

浏览:27日期:2022-10-07

问题描述

问题解答

回答1:

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分钟过期

{ exp: Date.now()+10*60*1000,}

然后你可以持久化存储到你的localstorage, sessionStorage或者cookie里面,这个token通过请求传到服务端,验证(调用koa-jwt的verify的时候)的时候就会报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的过期时间)。

自定义类似exp的属性,因为exp是保留属性,所以你可以设置一个origin-iat上次颁发的时间,然后持久化存储,之后解出token之后,判断当前时间和origin-iat的时间差有没有达到你的过期时间,达到了就重新要求鉴权,重新颁发token, 伪代码如下

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

相关文章: