express之jwt使用

JSON Web Token(JWT)是目前最流行的跨域身份驗證解決方案。前端

架構圖:git

https://upload-images.jianshu.io/upload_images/3383598-c82676bb8445bae9.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp

特色:github

  • JWT默認不加密,但能夠加密。生成原始令牌後,可使用改令牌再次對其進行加密。
  • 當JWT未加密方法是,一些私密數據沒法經過JWT傳輸。
  • JWT不只可用於認證,還可用於信息交換。善用JWT有助於減小服務器請求數據庫的次數。

配合express使用

一、安裝依賴

> npm install jsonwebtoken express-jwt -S

二、服務端生成token

var jwt = require('jsonwebtoken');

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

如登陸完成後返回給前端web

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

前端傳輸token

拿到服務端返回的token後,這裏要存儲起來,而後在須要驗證的接口上添加token,傳輸給服務端,headers傳輸示例以下:ajax

$.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是如何使用的呢?

總體流程:express

微信截圖_20191122233132.png

服務端生成方式不變,不過前端的傳輸方式變成這樣了,這裏再也不是token了,而是約定好的authorization了npm

$.ajax({
  headers: {
    authorization: 'Bearer ' + localStorage.getItem('token') // "Bearer "這個也是約定的,必須是這樣的格式
  },
  // ...
});

服務端使用json

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

前端驗證跨域

$.ajaxSetup({
    complete: function (res) { // 接口請求完成攔截
        // 驗證token,不存在 從新獲取或退出登陸
    }
});

總體步驟很少,因爲是封裝好的,使用起來也比較方便。

JWT缺點:

  • JWT的最大缺點是服務器不保存會話狀態,因此在使用期間不可能取消令牌或更改令牌的權限。也就是說,一旦JWT簽發,在有效期內將會一直有效。
  • JWT自己包含認證信息,所以一旦信息泄露,任何人均可以得到令牌的全部權限。爲了減小盜用,JWT的有效期不宜設置太長。對於某些重要操做,用戶在使用時應該每次都進行進行身份驗證。

爲了減小盜用和竊取,JWT不建議使用HTTP協議來傳輸代碼,而是使用加密的HTTPS協議進行傳輸。

相關文章
相關標籤/搜索