NodeJS基于JWT实现⾝份验证(token、⾃动登陆)
JWT 简单的原理介绍
JWT(Json Web Token)是⼀种⾝份验证及授权⽅案,简单的说就是调⽤端调⽤ api 时,附带上⼀个由 api 端颁发的 token,以此来验证调⽤者的授权信息。
通过⼀种加密规则(如 HS256)+ secret ⽣成⼀串字符串(token),token 字符串中⼀般含有过期时间和签名信息,根据签名和过期时间,就可以判断当前 token 是否有效。
// newToken是根据 'jwt_secret' ⽣成的, jws.verify⽤于校验当前token是否是根据当前secret⽣成的
console.log(jws.verify(newToken, 'HS256', 'jwt_secret')); // true
console.log(jws.verify(newToken, 'HS256', '-=-=-=')); // false
⽆论使⽤哪个 secret ⽣成的 token,都是可以解析到 payload 的内容的,仅仅只是签名不同,
payload 的常见内容:
{
uuid: "3455445-acuya7skeasd-iue7", // token的有效内容
phone: 133409899625, // token的有效内容
expires: 1591066434678, // token的过期时间
},[signature]
根据 expires 判断 token 是否过期,根据 signature 判断当前 token 是否时本⼈创建,根据这两点就可以判断 token 是否有效了。
NodeJS 中如何应⽤ JWT
1. 安装 jsonwebtoken
npm install jsonwebtoken --save
PS: 也可以安装,jsonwebtoken 是基于 jws 进⾏封装的,简化了使⽤⽅式。
2.封装 JWT 函数
import jsonwebtoken from 'jsonwebtoken';
const secret = 'test_key';
export default class JWT {
public static generate(value: any, expires = '7 days'): string { // value 为传⼊值, expires为过期时间,这两者都会在token字符串中题先
try {
return jsonwebtoken.sign(value, secret, { expiresIn: expires });
} catch (e) {
<('jwt sign error --->', e);
return '';
}
}
public static verify(token: string) {
js assigntry {
return jsonwebtoken.verify(token, secret); // 如果过期将返回false
} catch (e) {
<('jwt verify error --->', e);
return false;
}
}
}
测试 JWT ⽅法,开发中建议使⽤ Jest 等⼯具写点单元测试,这⾥就简化了....
const payload = {
uuid: '3455445-acuya7skeasd-iue7',
phone: 133409899625,
};
const token = ate(payload, '12s');
const info = JWT.verify(token);
console.log(token);
console.log(info);
setTimeout(() => {
console.log('检验过期token');
const info2 = JWT.verify(token);
console.log(info2); // false
}, 13000);
/
*
控制台打印:
uuid: '3455445-acuya7skeasd-iue7', // 传⼊的数据
phone: 133409899625, // 传⼊的数据
iat: 1590990409,
exp: 1591076809 // 过期时间,不需要我们进⾏判断jsonwebtoken会帮我们进⾏过期校验,如果过期会返回false
}
*/
3. 封装⾃动校验的中间件
import { Context, Next } from 'koa';
import { JWT } from '../utils';
const Auth = async (ctx: Context, next: Next) => {
const { authorization = '' } = quest.header;
const token = place('Bearer ', '');
const info = JWT.verify(token);
if (info) {
ctx.state.info = info; // 将信息存放到 state 中
} else {
ctx.throw(401, 'token error');
}
await next();
};
export default Auth;
4. 在 router 中使⽤
import Router from 'koa-router';
import UserController from '../controllers/user';
import Auth from '../middleware/auth'
const router = new Router<DefaultState, Context>({prefix: '/v1.0'});
router.post("/check", Auth, UserController.check); //只有通过 Auth 检测,才会进⼊ check 函数
router.post("/sendOTP", UserController.sendOTP);
export default router;
5. 在 Controller 中获取校验后的信息
...
async check(ctx: Context) {
const { mobile, uuid } = ctx.state.info; // 获取 Auth 中传递的数据
const result = await getInfo(uuid); // 获取数据库中的⽤户信息,getInfo 是封装的公⽤⽅法,这⾥旧暂略了
const token = ate({ mobile, uuid }, '1d'); // 更新 token 时间(⽣成⼀条新的 token,旧的 token 任然是可以使⽤的) const data = Object.assign({}, result, { token });
ctx.body = {
status:200,
message: 'Success',
result: data
}
}
...
6. 前端传递 token
前端使⽤ axios 进⾏数据发送
import axios from 'axios';
axios.defaults.withCredentials = true;
// 将 token 放到⾥⾯处理
quest.use(function (config) {
const requestToken = getCookie('token'); // 获取我们存储的 token
config.headers['Authorization'] = 'Bearer ' + requestToken; // 将 token 放到 header ⾥⾯
config.headers.post['Content-Type'] = 'application/json';
config.timeout = 60000;
return config;
});
⾄此,NodeJS中使⽤ JWT 就算完成了。。。。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论