koa 项目实战(九)passport验证token
1.安装模块
npm install koa-passport -D npm install passport-jwt -D
2.解析token
根目录/config/passport.js
const JwtStrategy = require('passport-jwt').Strategy,
ExtractJwt = require('passport-jwt').ExtractJwt;
const keys = require('../config/keys');
const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.secretOrkey;
const mongoose = require('mongoose');
const User = mongoose.model('users');
module.exports = passport => {
passport.use(new JwtStrategy(opts, async function (jwt_payload, done) {
// console.log(jwt_payload);
const user = await User.findById(jwt_payload.id);
if (user) {
return done(null, user);
} else {
return done(null, false);
}
}));
};
3.引用
根目录/app.js
const passport = require('koa-passport');
...
// 初始化 passport
app.use(passport.initialize());
app.use(passport.session());
// 回调到config文件中 passport.js
require('./config/passport')(passport);
4.获取用户信息接口
/**
* @route GET api/users/current
* @desc 用户信息接口地址 返回用户信息
* @access 接口是私密的
*/
router.get(
'/current',
passport.authenticate('jwt', { session: false }),
async ctx => {
ctx.body = {
id: ctx.state.user.id,
name: ctx.state.user.name,
email: ctx.state.user.email,
avatar: ctx.state.user.avatar
};
}
);
根目录/routes/api/users.js
const Router = require('koa-router');
const router = new Router();
const bcrypt = require('bcryptjs');
const gravatar = require('gravatar');
const tools = require('../../config/tools');
const jwt = require('jsonwebtoken');
const keys = require('../../config/keys');
const passport = require('koa-passport');
// 引入User
const User = require('../../models/User');
/**
* @route GET api/users/test
* @desc 测试接口地址
* @access 接口是公开的
*/
router.get('/test', async ctx => {
ctx.status = 200;
ctx.body = { msg: 'users works...' };
});
/**
* @route POST api/users/register
* @desc 注册接口地址
* @access 接口是公开的
*/
router.post('/register', async ctx => {
// console.log(ctx.request.body);
// 通过邮箱判读是否注册过
const findResult = await User.find({ email: ctx.request.body.email });
// console.log(findResult);
if (findResult.length > 0) {
ctx.status = 500;
ctx.body = { email: '邮箱已被占用 ' };
} else {
const avatar = gravatar.url(ctx.request.body.email, { s: '200', r: 'pg', d: 'mm' });
const newUser = new User({
name: ctx.request.body.name,
email: ctx.request.body.email,
avatar,
password: tools.enbcrypt(ctx.request.body.password)
});
// console.log(newUser);
// 存储到数据库
await newUser.save().then(user => {
ctx.body = user;
}).catch(err => {
console.log(err);
});
// 返回json数据
ctx.body = newUser;
}
});
/**
* @route POST api/users/login
* @desc 登录接口地址
* @access 接口是公开的
*/
router.post('/login', async ctx => {
// 查询
const findResult = await User.find({ email: ctx.request.body.email });
const user = findResult[0];
const password = ctx.request.body.password;
// 判断差没查到
if (findResult.length == 0) {
ctx.status = 404;
ctx.body = { email: '用户不存在!' };
} else {
// 查到后 验证密码
var result = await bcrypt.compareSync(password, user.password);
// 校验通过
if (result) {
// 返回token
const payload = { id: user.id, name: user.name, avatar: user.avatar };
const token = jwt.sign(payload, keys.secretOrkey, { expiresIn: 3600 });
ctx.status = 200;
ctx.body = { success: true, token: 'Bearer ' + token };
} else {
ctx.status = 400;
ctx.body = { password: '密码错误!' };
}
}
})
/**
* @route GET api/users/current
* @desc 用户信息接口地址 返回用户信息
* @access 接口是私密的
*/
router.get(
'/current',
passport.authenticate('jwt', { session: false }),
async ctx => {
ctx.body = {
id: ctx.state.user.id,
name: ctx.state.user.name,
email: ctx.state.user.email,
avatar: ctx.state.user.avatar
};
}
);
module.exports = router.routes();
5.效果图

koa 项目实战(九)passport验证token的更多相关文章
- koa 项目实战(八)生成token
1.安装模块 npm install jsonwebtoken --save 2.引用 const jwt = require('jsonwebtoken'); ... // 返回token cons ...
- koa 项目实战(十一)验证登录和注册的 input
1.验证注册参数 根目录/validation/register.js const Validator = require('validator'); const isEmpty = require( ...
- koa 项目实战(十)使用 validator 验证表单
1.安装模块 npm install validator -D 2.验证注册参数 根目录/validation/register.js const Validator = require('valid ...
- koa 项目实战(七)登录接口
1.登录接口 /** * @route POST api/users/login * @desc 登录接口地址 * @access 接口是公开的 */ router.post('/login', as ...
- koa 项目实战(四)注册接口和调试工具(postman)
1.安装模块 npm install koa-bodyparser --save npm install bcryptjs --save 2.引入模块 根目录/app.js const bodyPar ...
- koa 项目实战(三)创建测试接口和用户模型
1.创建测试接口,并引入用户模型 根目录/routes/api/users.js const Router = require('koa-router'); const router = new Ro ...
- koa 项目实战(二)连接 mongodb 数据库
1.配置文件 根目录/config/keys.js module.exports = { mongoURI: 'mongodb://127.0.0.1:27017/mongodb' } 2.启动文件 ...
- koa 项目实战(一)创建项目
1.安装模块 npm install koa koa-router --save npm install -g nodemon 2.入口文件 app.js const Koa = require('k ...
- koa 项目实战(六)注册接口加密
1.创建工具类 根目录/config/tools.js const bcrypt = require('bcryptjs'); const tools = { enbcrypt(password) { ...
随机推荐
- 使用cnpm淘宝镜像
选装cnpm 1.说明:因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事. 2.官方网址:http://npm.ta ...
- Apache httpclient的execute方法调试
因为工作需要,想研究一下execute执行的逻辑. 在这一行调用execute: response = getHttpClient().execute(get); getHttpClient的实现: ...
- [react] - 循环请求 redux-saga
//根据uuid 获取 apt报告信息 *getNotesByUid({ payload, callback }, { call, put }) { // payload 是个数组, 并发执行,参考r ...
- 九:MVC主从表数据加载
EF对关联表数据加载的三种方式: 延迟加载:只有在需要的时候加载数据.EF默认的加载方式. 贪婪加载:一次性组织好数据,全部加载到内存中. 显式加载:需要通过代码手动加载关联表. 延迟加载 virtu ...
- Hive2.0常用函数(对编辑器很无语😓)
Hive内部提供了很多函数给开发者使用,包括数学函数,类型转换函数,条件函数,字符函数,聚合函数,表生成函数等等,这些函数都统称为内置函数. 参考:https://cwiki.apache.org/c ...
- Tarjan-CV/BCC/SCC算法学习笔记
DFS性质的应用--利用Tarjan算法求割顶.BCC.SCC 整理自<算法竞赛入门经典--训练指南>以及网络 DFS (depth first search)深度优先搜索算法 dfs森林 ...
- linux 的常用命令(2)
tail [必要参数] [选择参数] [文件] | 显示文件结尾内容 -v 显示详细的处理信息-q 不显示处理信息-num/-n (-)num 显示最后num行内容-n +num 从第 ...
- TODO redis学习笔记
redis官网教程地址:http://try.redis.io/ redis脚本和命令部分来自:https://www.runoob.com/redis/redis-security.html red ...
- PC客户端自动化测试工具--pywinauto
1.安装 pywinauto pip install pywinauto 2.打开PC的.exe可执行文件的,一种方式就够用了 from pywinauto import application ap ...
- 【组合数学】AGC036C - GP 2
找性质的能力不行 Problem Statement We have a sequence of $N$ integers: $x=(x_0,x_1,\cdots,x_{N−1})$. Initial ...