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) { ...
随机推荐
- vue学习(10)-vue-resource
下载:cnpm i vue-resource --save 在main.js导入包:import VueResource from 'vue-resource' 安装:Vue.use(VueResou ...
- S5PV210 点亮Led
GPC1CON, R/W, Address = 0xE020_0080 GPC1DAT, R/W, Address = 0xE020_0084 举例 #define GPC1CON *((volati ...
- MySQL时间类型及获取、展示处理
MySQL时间格式 mysql所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值 ...
- 10.SpringMVC注解式开发-处理器方法的参数
1.逐个参数接收 只要保证请求参数名与该请求处理方法的参数名相同即可 // 请求参数名 与该处理器中的请求方法的参数名相同 ,即可接收前台传递过来的参数 public ModelAndView met ...
- 使用JPA完成增删改查操作
基础的增删改查操作如下: package cn.itheima.test; import cn.itcast.domain.Customer; import cn.itcast.utils.JpaUt ...
- 第一章 Django之MVC模式(2)
让我们来研究一个简单的例子,通过该实例,你可以分辨出,通过 Web 框架来实现的功能与之前的方式有何不同.下面就是通过使用 Django 来完成以上功能的例子: # models.py (the da ...
- VMware无法连接MKS:套接字连接尝试次数太多解决
粘贴自:https://jingyan.baidu.com/article/425e69e61eb578be15fc16ae.html VMware在开启虚拟机的时候,突然弹出[无法连接MKS:套接字 ...
- centos7 nginx设置开启启动
添加系统服务 在 /usr/lib/systemd/system 目录中添加 nginx.service,根据实际情况进行修改,详细解析可查看下方参考资料中的文章.内容如下 ? [Unit] ...
- Redis入门(二)——基本操作
Redis作为独立的服务端,在Java中去操作redis需要通过Redis提供的jar z在这里特别申明,除了基本数据以及String外,其余对象,要想写入redis,必须序列化(即使是对象也要实现序 ...
- ftp定时下载指定目录或文件脚本
#! /bin/bash rpm -qa lftp &>/dev/null || yum install -y lftp lftp 160.106.0.34 << EOF c ...