sau交流学习社区--songEagle开发系列:Vue.js + Koa.js项目中使用JWT认证

前端之家收集整理的这篇文章主要介绍了sau交流学习社区--songEagle开发系列:Vue.js + Koa.js项目中使用JWT认证前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、前言

JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。

JWT不是一个新鲜的东西,网上相关的介绍已经非常多了。不是很了解的可以在网上搜索一下相关信息。

同步

二、源码

三、工作流程

JWT本质来说是一个token。在前后端进行HTTP连接时来进行相应的验证。

1. 博客后台管理系统发起登录请求,后端服务器校验成功之后,生成JWT认证信息;

2. 前端接收到JWT后进行存储;

3. 前端在之后每次接口调用发起HTTP请求时,会将JWT放到HTTP的headers参数里的authorization中一起发送给后端;

4. 后端接收到请求时会根据JWT中的信息来校验当前发起HTTP请求的用户是否是具有访问权限的,有访问权限时则交给服务器继续处理,没有时则直接返回401错误

四、实现过程

@H_301_28@1. 登录成功生成JWT
说明:以下代码只保留了核心代码,详细代码可在对应文件中查看,下同。
const jwt = require('jsonwebtoken'= require('../../config/config'exports.login = async(ctx) =><span style="color: #000000;"> {
<span style="color: #008000;">//
<span style="color: #008000;"> ...

<span style="color: #0000ff;">if (hashedPassword ===<span style="color: #000000;"> hashPassword) {
<span style="color: #008000;">//<span style="color: #008000;"> ...
<span style="color: #008000;">//<span style="color: #008000;"> 用户token
const userToken =<span style="color: #000000;"> {
name: userName,id: results[0<span style="color: #000000;">].id
};
<span style="color: #008000;">//<span style="color: #008000;"> 签发token
const token = jwt.sign(userToken,config.tokenSecret,{ expiresIn: '2h'<span style="color: #000000;"> });
<span style="color: #008000;">//<span style="color: #008000;"> ...
<span style="color: #000000;"> }
<span style="color: #008000;">//<span style="color: #008000;"> ...
}

@H_301_28@2. 添加中间件校验JWT、
<div class="cnblogs_code">


const jwt = require('jsonwebtoken'= require('../config/config'= require('util'=<span style="color: #008000;">/<span style="color: #008000;">

  • 判断token是否可用
    <span style="color: #008000;">*/<span style="color: #000000;">
    module.exports = <span style="color: #0000ff;">function<span style="color: #000000;"> () {
    <span style="color: #0000ff;">return async <span style="color: #0000ff;">function<span style="color: #000000;"> (ctx,next) {
    <span style="color: #0000ff;">try<span style="color: #000000;"> {
    <span style="color: #008000;">//<span style="color: #008000;"> 获取jwt
    const token =<span style="color: #000000;"> ctx.header.authorization;
    <span style="color: #0000ff;">if<span style="color: #000000;"> (token) {
    <span style="color: #0000ff;">try<span style="color: #000000;"> {
    <span style="color: #008000;">//<span style="color: #008000;"> 解密payload,获取用户名和ID
    let payload = await verify(token.split(' ')[1<span style="color: #000000;">],config.tokenSecret);
    ctx.user =<span style="color: #000000;"> {
    name: payload.name,id: payload.id
    };
    } <span style="color: #0000ff;">catch<span style="color: #000000;"> (err) {
    console.log('token verify fail: '<span style="color: #000000;">,err)
    }
    }
    await next();
    } <span style="color: #0000ff;">catch<span style="color: #000000;"> (err) {
    <span style="color: #0000ff;">if (err.status === 401<span style="color: #000000;">) {
    ctx.status = 401<span style="color: #000000;">;
    ctx.body =<span style="color: #000000;"> {
    success: 0<span style="color: #000000;">,message: '认证失败'<span style="color: #000000;">
    };
    } <span style="color: #0000ff;">else<span style="color: #000000;"> {
    err.status = 404<span style="color: #000000;">;
    ctx.body =<span style="color: #000000;"> {
    success: 0<span style="color: #000000;">,message: '404'<span style="color: #000000;">
    };
    }
    }
    }
    }

@H_301_28@3. Koa.js中添加JWT处理

此处在开发时需要过滤掉登录接口(login),否则会导致JWT验证永远失败。

const jwt = require('koa-jwt'= require('../middlreware/tokenError' = app.use(tokenError());
app.use(bodyParser());
app.use(koaJson());
app.use(resource(path.join(config.root,config.appPath)));

app.use(jwt({
secret: config.tokenSecret
}).unless({
path: [/^\/backapi\/admin\/login/,/^\/blogapi\//<span style="color: #000000;">]
}));

module.exports = app;

@H_301_28@4.前端处理

前端开发使用的是Vue.js,发送HTTP请求使用的是axios。

1. 登录成功之后将JWT存储到localStorage中(可根据个人需要存储,我个人是比较喜欢存储到localStorage中)。

let res = await api.login(.userName, (res.success === 1.errMsg = '''SONG_EAGLE_TOKEN'.$router.push({ path: '/postlist'.errMsg =

2. Vue.js的router(路由)跳转前校验JWT是否存在,不存在则跳转登录页面

router.beforeEach((to,from,next) =>Meta.requireAuth) { const token = localStorage.getItem('SONG_EAGLE_TOKEN' (token && token !== 'null''/login'

3. axios拦截器中给HTTP统一添加Authorization信息

=>= localStorage.getItem('SONG_EAGLE_TOKEN' config.headers.common['Authorization'] = 'Bearer ' +=>

4. axios拦截器在接收到HTTP返回时统一处理返回状态

=>=> (error.response.status === 401Box.showMsgBox({ title: '错误提示''您的登录信息已失效,请重新登录'=>'/login'(() =>'cancel''error''系统出现错误'

五、总结

这个基本上就是JWT的流程。当然单纯的JWT并不是说绝对安全的,不过对于一个个人博客系统的认证来说还是足够的。

最后打个小广告。目前正在开发新版的个人博客中,包括两部分:

【前端】()

【后端】()

都已在GitHub上开源,目前在逐步完善功能中。欢迎感兴趣的同学fork和star。

猜你在找的Node.js相关文章