nodeegg.js

express之jwt使用

2019-12-09  本文已影响0人  小程序前端超市

JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案。

架构图:

https://img.haomeiwen.com/i3383598/c82676bb8445bae9.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp

特点:

配合express使用

1、安装依赖

> npm install jsonwebtoken express-jwt -S

2、服务端生成token

var jwt = require('jsonwebtoken');

// 生成token
function generateToken() {
  return jwt.sign({
            foo: 'bar',
          }, 'hahaha', {
            expiresIn: '1d' // 1天 https://github.com/zeit/ms
          });
}

如登录完成后返回给前端

router.post('/xxx/login', function(req, res, next) {
  res.json({
    status: true,
    data: {
      token: generateToken()
    },
    message: '登录成功!'
  });
});

前端传输token

拿到服务端返回的token后,这里要存储起来,然后在需要验证的接口上添加token,传输给服务端,headers传输示例如下:

$.ajax({
  headers: {
    token: localStorage.getItem('token') // 通过headers传输token到服务端
  },
  // ...
});

服务端路由拦截

var jwt = require('jsonwebtoken');

router.use(function(req, res, next) {
  if(req.headers.hasOwnProperty('token')) {
    jwt.verify(req.headers.token, 'hahaha', function(err, decoded) {
      if(err) {
        res.json({
          status: false,
          message: 'token不存在或已过期'
        });
      } else {
        next();
      }
    });
  } else {
    next();
  }
});

上面代码是纯使用jsonwebtoken方式处理的,从生成传输到验证一条龙。

那么express-jwt是如何使用的呢?

整体流程:

[图片上传失败...(image-c50828-1575871782225)]

服务端生成方式不变,不过前端的传输方式变成这样了,这里不再是token了,而是约定好的authorization了

$.ajax({
  headers: {
    authorization: 'Bearer ' + localStorage.getItem('token') // "Bearer "这个也是约定的,必须是这样的格式
  },
  // ...
});

服务端使用

router.post('/xxx', expressJWT({secret: 'hahaha'}), function (req, res, next) {
  // ...
});

前端验证

$.ajaxSetup({
    complete: function (res) { // 接口请求完成拦截
        // 验证token,不存在 重新获取或退出登录
    }
});

整体步骤不多,由于是封装好的,使用起来也比较方便。

JWT缺点:

为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。

写到最后,欢迎关注作者:http://fenxianglu.cn/

上一篇 下一篇

猜你喜欢

热点阅读