1.安装模块

  1. npm install koa-passport -D
  2.  
  3. npm install passport-jwt -D

2.解析token

根目录/config/passport.js

  1. const JwtStrategy = require('passport-jwt').Strategy,
  2. ExtractJwt = require('passport-jwt').ExtractJwt;
  3. const keys = require('../config/keys');
  4. const opts = {};
  5. opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
  6. opts.secretOrKey = keys.secretOrkey;
  7. const mongoose = require('mongoose');
  8. const User = mongoose.model('users');
  9.  
  10. module.exports = passport => {
  11. passport.use(new JwtStrategy(opts, async function (jwt_payload, done) {
  12. // console.log(jwt_payload);
  13. const user = await User.findById(jwt_payload.id);
  14. if (user) {
  15. return done(null, user);
  16. } else {
  17. return done(null, false);
  18. }
  19. }));
  20. };

3.引用

根目录/app.js

  1. const passport = require('koa-passport');
  2. ...
  3.  
  4. // 初始化 passport
  5. app.use(passport.initialize());
  6. app.use(passport.session());
  7.  
  8. // 回调到config文件中 passport.js
  9. require('./config/passport')(passport);

4.获取用户信息接口

  1. /**
  2. * @route GET api/users/current
  3. * @desc 用户信息接口地址 返回用户信息
  4. * @access 接口是私密的
  5. */
  6. router.get(
  7. '/current',
  8. passport.authenticate('jwt', { session: false }),
  9. async ctx => {
  10. ctx.body = {
  11. id: ctx.state.user.id,
  12. name: ctx.state.user.name,
  13. email: ctx.state.user.email,
  14. avatar: ctx.state.user.avatar
  15. };
  16. }
  17. );

根目录/routes/api/users.js

  1. const Router = require('koa-router');
  2. const router = new Router();
  3. const bcrypt = require('bcryptjs');
  4. const gravatar = require('gravatar');
  5. const tools = require('../../config/tools');
  6. const jwt = require('jsonwebtoken');
  7. const keys = require('../../config/keys');
  8. const passport = require('koa-passport');
  9.  
  10. // 引入User
  11. const User = require('../../models/User');
  12.  
  13. /**
  14. * @route GET api/users/test
  15. * @desc 测试接口地址
  16. * @access 接口是公开的
  17. */
  18. router.get('/test', async ctx => {
  19. ctx.status = 200;
  20. ctx.body = { msg: 'users works...' };
  21. });
  22.  
  23. /**
  24. * @route POST api/users/register
  25. * @desc 注册接口地址
  26. * @access 接口是公开的
  27. */
  28. router.post('/register', async ctx => {
  29. // console.log(ctx.request.body);
  30.  
  31. // 通过邮箱判读是否注册过
  32. const findResult = await User.find({ email: ctx.request.body.email });
  33. // console.log(findResult);
  34. if (findResult.length > 0) {
  35. ctx.status = 500;
  36. ctx.body = { email: '邮箱已被占用 ' };
  37. } else {
  38. const avatar = gravatar.url(ctx.request.body.email, { s: '200', r: 'pg', d: 'mm' });
  39. const newUser = new User({
  40. name: ctx.request.body.name,
  41. email: ctx.request.body.email,
  42. avatar,
  43. password: tools.enbcrypt(ctx.request.body.password)
  44. });
  45.  
  46. // console.log(newUser);
  47. // 存储到数据库
  48. await newUser.save().then(user => {
  49. ctx.body = user;
  50. }).catch(err => {
  51. console.log(err);
  52. });
  53.  
  54. // 返回json数据
  55. ctx.body = newUser;
  56. }
  57. });
  58.  
  59. /**
  60. * @route POST api/users/login
  61. * @desc 登录接口地址
  62. * @access 接口是公开的
  63. */
  64. router.post('/login', async ctx => {
  65. // 查询
  66. const findResult = await User.find({ email: ctx.request.body.email });
  67. const user = findResult[0];
  68. const password = ctx.request.body.password;
  69.  
  70. // 判断差没查到
  71. if (findResult.length == 0) {
  72. ctx.status = 404;
  73. ctx.body = { email: '用户不存在!' };
  74. } else {
  75. // 查到后 验证密码
  76. var result = await bcrypt.compareSync(password, user.password);
  77.  
  78. // 校验通过
  79. if (result) {
  80. // 返回token
  81. const payload = { id: user.id, name: user.name, avatar: user.avatar };
  82. const token = jwt.sign(payload, keys.secretOrkey, { expiresIn: 3600 });
  83.  
  84. ctx.status = 200;
  85. ctx.body = { success: true, token: 'Bearer ' + token };
  86. } else {
  87. ctx.status = 400;
  88. ctx.body = { password: '密码错误!' };
  89. }
  90. }
  91. })
  92.  
  93. /**
  94. * @route GET api/users/current
  95. * @desc 用户信息接口地址 返回用户信息
  96. * @access 接口是私密的
  97. */
  98. router.get(
  99. '/current',
  100. passport.authenticate('jwt', { session: false }),
  101. async ctx => {
  102. ctx.body = {
  103. id: ctx.state.user.id,
  104. name: ctx.state.user.name,
  105. email: ctx.state.user.email,
  106. avatar: ctx.state.user.avatar
  107. };
  108. }
  109. );
  110.  
  111. module.exports = router.routes();

5.效果图

koa 项目实战(九)passport验证token的更多相关文章

  1. koa 项目实战(八)生成token

    1.安装模块 npm install jsonwebtoken --save 2.引用 const jwt = require('jsonwebtoken'); ... // 返回token cons ...

  2. koa 项目实战(十一)验证登录和注册的 input

    1.验证注册参数 根目录/validation/register.js const Validator = require('validator'); const isEmpty = require( ...

  3. koa 项目实战(十)使用 validator 验证表单

    1.安装模块 npm install validator -D 2.验证注册参数 根目录/validation/register.js const Validator = require('valid ...

  4. koa 项目实战(七)登录接口

    1.登录接口 /** * @route POST api/users/login * @desc 登录接口地址 * @access 接口是公开的 */ router.post('/login', as ...

  5. koa 项目实战(四)注册接口和调试工具(postman)

    1.安装模块 npm install koa-bodyparser --save npm install bcryptjs --save 2.引入模块 根目录/app.js const bodyPar ...

  6. koa 项目实战(三)创建测试接口和用户模型

    1.创建测试接口,并引入用户模型 根目录/routes/api/users.js const Router = require('koa-router'); const router = new Ro ...

  7. koa 项目实战(二)连接 mongodb 数据库

    1.配置文件 根目录/config/keys.js module.exports = { mongoURI: 'mongodb://127.0.0.1:27017/mongodb' } 2.启动文件 ...

  8. koa 项目实战(一)创建项目

    1.安装模块 npm install koa koa-router --save npm install -g nodemon 2.入口文件 app.js const Koa = require('k ...

  9. koa 项目实战(六)注册接口加密

    1.创建工具类 根目录/config/tools.js const bcrypt = require('bcryptjs'); const tools = { enbcrypt(password) { ...

随机推荐

  1. vue学习(10)-vue-resource

    下载:cnpm i vue-resource --save 在main.js导入包:import VueResource from 'vue-resource' 安装:Vue.use(VueResou ...

  2. S5PV210 点亮Led

    GPC1CON, R/W, Address = 0xE020_0080 GPC1DAT, R/W, Address = 0xE020_0084 举例 #define GPC1CON *((volati ...

  3. MySQL时间类型及获取、展示处理

    MySQL时间格式 mysql所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值 ...

  4. 10.SpringMVC注解式开发-处理器方法的参数

    1.逐个参数接收 只要保证请求参数名与该请求处理方法的参数名相同即可 // 请求参数名 与该处理器中的请求方法的参数名相同 ,即可接收前台传递过来的参数 public ModelAndView met ...

  5. 使用JPA完成增删改查操作

    基础的增删改查操作如下: package cn.itheima.test; import cn.itcast.domain.Customer; import cn.itcast.utils.JpaUt ...

  6. 第一章 Django之MVC模式(2)

    让我们来研究一个简单的例子,通过该实例,你可以分辨出,通过 Web 框架来实现的功能与之前的方式有何不同.下面就是通过使用 Django 来完成以上功能的例子: # models.py (the da ...

  7. VMware无法连接MKS:套接字连接尝试次数太多解决

    粘贴自:https://jingyan.baidu.com/article/425e69e61eb578be15fc16ae.html VMware在开启虚拟机的时候,突然弹出[无法连接MKS:套接字 ...

  8. centos7 nginx设置开启启动

    添加系统服务 在 /usr/lib/systemd/system 目录中添加 nginx.service,根据实际情况进行修改,详细解析可查看下方参考资料中的文章.内容如下 ?     [Unit] ...

  9. Redis入门(二)——基本操作

    Redis作为独立的服务端,在Java中去操作redis需要通过Redis提供的jar z在这里特别申明,除了基本数据以及String外,其余对象,要想写入redis,必须序列化(即使是对象也要实现序 ...

  10. ftp定时下载指定目录或文件脚本

    #! /bin/bash rpm -qa lftp &>/dev/null || yum install -y lftp lftp 160.106.0.34 << EOF c ...