个人博客开发系列:Vue.js + Koa.js项目中使用JWT认证
前言
JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。
更多的介绍和说明,以及各种原理,我在此就不多赘诉了。JWT不是一个新鲜的东西,网上相关的介绍已经非常多了。不是很了解的可以在网上搜索一下相关信息。
源码
Talk is cheap. Show me the code.
工作流程
JWT本质来说是一个token。在前后端进行HTTP连接时来进行相应的验证。
- 博客的后台管理系统发起登录请求,后端服务器校验成功之后,生成JWT认证信息;
- 前端接收到JWT后进行存储;
- 前端在之后每次接口调用发起HTTP请求时,会将JWT放到HTTP的headers参数里的authorization中一起发送给后端;
- 后端接收到请求时会根据JWT中的信息来校验当前发起HTTP请求的用户是否是具有访问权限的,有访问权限时则交给服务器继续处理,没有时则直接返回401错误。
实现过程
1. 登录成功生成JWT
说明:以下代码只保留了核心代码,详细代码可在对应文件中查看,下同。
// /server/api/admin/admin.controller.js
const jwt = require('jsonwebtoken');
const config = require('../../config/config');
exports.login = async(ctx) => {
// ...
if (hashedPassword === hashPassword) {
// ...
// 用户token
const userToken = {
name: userName,
id: results[0].id
};
// 签发token
const token = jwt.sign(userToken, config.tokenSecret, { expiresIn: '2h' });
// ...
}
// ...
}
2. 添加中间件校验JWT
// /server/middlreware/tokenError.js
const jwt = require('jsonwebtoken');
const config = require('../config/config');
const util = require('util');
const verify = util.promisify(jwt.verify);
/**
* 判断token是否可用
*/
module.exports = function () {
return async function (ctx, next) {
try {
// 获取jwt
const token = ctx.header.authorization;
if (token) {
try {
// 解密payload,获取用户名和ID
let payload = await verify(token.split(' ')[1], config.tokenSecret);
ctx.user = {
name: payload.name,
id: payload.id
};
} catch (err) {
console.log('token verify fail: ', err)
}
}
await next();
} catch (err) {
if (err.status === 401) {
ctx.status = 401;
ctx.body = {
success: 0,
message: '认证失败'
};
} else {
err.status = 404;
ctx.body = {
success: 0,
message: '404'
};
}
}
}
}
3. Koa.js中添加JWT处理
此处在开发时需要过滤掉登录接口(login),否则会导致JWT验证永远失败。
// /server/config/koa.js
const jwt = require('koa-jwt');
const tokenError = require('../middlreware/tokenError');
// ...
const app = new Koa();
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\//]
}));
module.exports = app;
4.前端处理
前端开发使用的是Vue.js,发送HTTP请求使用的是axios。
登录成功之后将JWT存储到localStorage中(可根据个人需要存储,我个人是比较喜欢存储到localStorage中)。
methods: {
login: async function () {
// ... let res = await api.login(this.userName, this.password);
if (res.success === 1) {
this.errMsg = '';
localStorage.setItem('DON_BLOG_TOKEN', res.token);
this.$router.push({ path: '/postlist' });
} else {
this.errMsg = res.message;
}
}
}
Vue.js的router(路由)跳转前校验JWT是否存在,不存在则跳转到登录页面。
// /src/router/index.js
router.beforeEach((to, from, next) => {
if (to.meta.requireAuth) {
const token = localStorage.getItem('DON_BLOG_TOKEN');
if (token && token !== 'null') {
next();
} else {
next('/login');
}
} else {
next();
}
});
axios拦截器中给HTTP统一添加Authorization信息
// /src/fetch/fetch.js
axios.interceptors.request.use(
config => {
const token = localStorage.getItem('DON_BLOG_TOKEN');
if (token) {
// Bearer是JWT的认证头部信息
config.headers.common['Authorization'] = 'Bearer ' + token;
}
return config;
},
error => {
return Promise.reject(error);
}
);
axios拦截器在接收到HTTP返回时统一处理返回状态
// /src/main.js
axios.interceptors.response.use(
response => {
return response;
},
error => {
if (error.response.status === 401) {
Vue.prototype.$msgBox.showMsgBox({
title: '错误提示',
content: '您的登录信息已失效,请重新登录',
isShowCancelBtn: false
}).then((val) => {
router.push('/login');
}).catch(() => {
console.log('cancel');
});
} else {
Vue.prototype.$message.showMessage({
type: 'error',
content: '系统出现错误'
});
}
return Promise.reject(error);
}
);
总结
到这里整个流程就走完了。当然单纯的JWT并不是说绝对安全的,不过对于一个个人博客系统的认证来说还是足够的。
最后打个小广告。目前正在开发新版的个人博客中,包括前端和后端两部分,都已在GitHub上开源,目前在逐步完善功能中。欢迎感兴趣的同学fork和star。
个人博客开发系列:Vue.js + Koa.js项目中使用JWT认证的更多相关文章
- sau交流学习社区--songEagle开发系列:Vue.js + Koa.js项目中使用JWT认证
一.前言 JWT(JSON Web Token),是为了在网络环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519). JWT不是一个新鲜的东西,网上相关的介绍已经非常多了.不是很了解的 ...
- Django个人博客开发 | 前言
本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier 1.前言 自学 Python,始于 Django 框架,Scrapy 框架,elasticsearch搜索引擎 ...
- django 简易博客开发 3 静态文件、from 应用与自定义
首先还是贴一下源代码地址 https://github.com/goodspeedcheng/sblog 上一篇博客我们介绍了 django 如何在views中使用templates以及一些常用的数 ...
- Django博客开发-数据建模与样式设定
开发流程介绍 之前Django的学习过程当中已经把基本Django开发学完了,现在以Django 的博客项目完成一遍课程的回顾和总结.同时来一次完整开发的Django体验. 一个产品从研究到编码我们要 ...
- Padrino 博客开发示例
英文版出处:http://www.padrinorb.com/guides/blog-tutorial 楼主按 拿作者自己的话说:Padrino(谐音:派骓诺)是一款基于Sinatra的优雅的Web应 ...
- 【全网最全的博客美化系列教程】08.自定义地址栏Logo
全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添 ...
- 【全网最全的博客美化系列教程】01.添加Github项目链接
全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添 ...
- 【全网最全的博客美化系列教程】02.添加QQ交谈链接
全网最全的博客美化系列教程相关文章目录 [全网最全的博客美化系列教程]01.添加Github项目链接 [全网最全的博客美化系列教程]02.添加QQ交谈链接 [全网最全的博客美化系列教程]03.给博客添 ...
- Django博客开发实践,初学者开发经验
python,Django初学者,开发简易博客,做了一下笔记,记录了开发的过程,功力浅薄,仅供初学者互相 交流,欢迎意见建议.具体链接:Django博客开发实践(一)--分析需求并创建项目 地址:ht ...
随机推荐
- HttpClient来自官方的JSON扩展方法
System.Net.Http.Json Json的序列化和反序列化是我们日常常见的操作,通过System.Net.Http.Json我们可以用少量的代码实现上述操作.正如在github设计文档中所描 ...
- nghttp2 交叉编译
touch run.sh chmod 755 run.sh mkdir build cd build ../run.sh run.sh #!/bin/bash #cd build ../configu ...
- MAC 系统java开发环境搭建教程
1.在安装JDK之前,先查看下自己电脑是否已经安装了JDK. 打开终端,输入java -version并回车. 从上图中可以看出我们已安装了,JDK 8.如果这个版本是你需要的版本,可直接看4 ...
- 数据结构和算法(Golang实现)(24)排序算法-优先队列及堆排序
优先队列及堆排序 堆排序(Heap Sort)由威尔士-加拿大计算机科学家J. W. J. Williams在1964年发明,它利用了二叉堆(A binary heap)的性质实现了排序,并证明了二叉 ...
- Visual C++ 6.0踩坑记录---在Win10下安装Visual C++ 6.0安装成功后点击“打开”按钮闪退问题
前言: 为了更好的学习C及C++,前段时间下载了Microsoft Visual C++ 6.0(以下简称VC6),原因是VC6具有查看反汇编代码.监视内存.寄存器等功能,并且因为本人正在学习滴水逆向 ...
- Java 数据类型转换的骚操作和神奇现象
问:银行用什么数据类型来表示余额?float还是double? 都不是!!下面说明为什么都不可以呢? public static void main(String[] args) { //浮点数他都是 ...
- JMock2入门
说明:学习JMock官网的Getting Started的笔记 例子:为测试publish/subscribe发布/订阅信息系统的publisher(发布者),mock subscriber(订阅者) ...
- jquery的焦点图片无限循环关键思维
在循环的时候,关键的是按(下一页按钮)到最后一页的时候和按(上一页按钮)到到第一页的时候如何转换: 首先必须知道3个js方法,prepend().append()和clone(); prepend() ...
- 使用python pip安装工具组件包:出现 requests File “<stdin>",line 1 pip install xxx ^ SyntaxError:invalid syntax
最近想要试试python ,软件安装完成了,但是,import 组件包时,出了问题,一直不得解:安装pycharm 工具感觉麻烦,不想安装那些,只想单纯使用python . 问题复现: 1.Windo ...
- L26 使用卷积及循环神经网络进行文本分类
文本情感分类 文本分类是自然语言处理的一个常见任务,它把一段不定长的文本序列变换为文本的类别.本节关注它的一个子问题:使用文本情感分类来分析文本作者的情绪.这个问题也叫情感分析,并有着广泛的应用. 同 ...