Egg реализует механизм аутентификации на основе токена jsonwebtoken.

Egg.js

Веб-токен Json (JWT) — это стандарт разработки на основе JSON (RFC 7519) для передачи утверждений между средами сетевых приложений.Токен разработан, чтобы быть компактным и безопасным, особенно для сценария единого входа на распределенные сайты (SSO). . Заявки JWT обычно используются для передачи аутентифицированной информации об удостоверении пользователя между поставщиками удостоверений и поставщиками услуг для получения ресурсов с серверов ресурсов, а также могут добавлять некоторую дополнительную информацию о заявке, необходимую для другой бизнес-логики.Можно использовать непосредственно для проверки подлинности или зашифровать.

Связанные технические моменты

eggmiddleware

официальный сайт джвт

node-jsonwebtoken

Установить

npm install jsonwebtoken

Написание промежуточного программного обеспечения

Создайте новый файл jwt.js в файле промежуточного ПО.

'use strict'
const fs = require('fs')
const path = require('path')
const jwt = require('jsonwebtoken') //引入jsonwebtoken

module.exports = (options, app) => {
  return async function userInterceptor(ctx, next) {
    let authToken = ctx.header.authorization // 获取header里的authorization
    if (authToken) {
      authToken = authToken.substring(7)
      const res = verifyToken(authToken) // 解密获取的Token
      if (res.corpid && res.userid) {
        // 如果需要限制单端登陆或者使用过程中废止某个token,或者更改token的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效
        // 此处使用redis进行保存
        const redis_token = await app.redis.get('loginToken').get(res.corpid + res.userid) // 获取保存的token
        if (authToken === redis_token) {
          ctx.locals.corpid = res.corpid
          ctx.locals.userid = res.userid
          await next()
        } else {
          ctx.body = { code: 50012, msg: '您的账号已在其他地方登录' }
        }
      } else {
        ctx.body = { code: 50012, msg: '登录状态已过期' }
      }
    } else {
      ctx.body = { code: 50008, msg: '请登陆后再进行操作' }
    }
  }
}

// 解密,验证
function verifyToken(token) {
  const cert = fs.readFileSync(path.join(__dirname, '../public/rsa_public_key.pem')) // 公钥,看后面生成方法
  let res = ''
  try {
    const result = jwt.verify(token, cert, { algorithms: [ 'RS256' ] }) || {}
    const { exp } = result,
      current = Math.floor(Date.now() / 1000)
    if (current <= exp) res = result.data || {}
  } catch (e) {
    console.log(e)
  }
  return res
}

Использовать промежуточное ПО

Добавьте следующую конфигурацию в config.default.js, чтобы завершить открытие и настройку промежуточного программного обеспечения.

// 方法一:在应用中使用中间件
config.middleware = [ 'jwt' ]

config.jwt = {
	enable: true,
	ignore: [ '/api/v1/test/', '/public/' ], // 哪些请求不需要认证
}

// 方法二:router中使用中间件
module.exports = app => {
  const jwt = app.middleware.jwt();
  app.router.get('/api/v1/test/', jwt, app.controller.test.test);
};

генерация токенов

Рекомендуется прописать его в хелпере для удобства вызова

loginToken(data, expires = 7200) {
  const exp = Math.floor(Date.now() / 1000) + expires
  const cert = fs.readFileSync(path.join(__dirname, '../public/rsa_private_key.pem')) // 私钥,看后面生成方法
  const token = jwt.sign({ data, exp }, cert, { algorithm: 'RS256' })
  return token
}

Вызовите метод генерации токена

const token = ctx.helper.loginToken({ corpid: usersData.corpid, userid: usersData.userid }, 7200) // token生成
await app.redis.get('loginToken').set(usersData.corpid + usersData.userid, token, 'ex', 7200) // 保存到redis
ctx.body = { data: { token, expires: this.config.login_token_time }, code: 1, msg: '登录成功' } // 返回前端

Интерфейсное использование

установить заголовкиAuthorization = 'Bearer ' + TokenДобавьте пробел после Bearer

例:axios中
// request拦截器
service.interceptors.request.use(config => {
  if (store.getters.token) {
    config.headers['Authorization'] = `Bearer ${getToken()}`
  }
  return config
}, error => {
  console.log(error)
  Promise.reject(error)
})

Используйте Openssl для создания закрытого ключа и открытого ключа

Вот как установить git под окнами Установить переменные среды Мой компьютер> Щелкните правой кнопкой мыши> Свойства> Дополнительные параметры системы> Переменные среды> путь> Изменить> Создатьgit路径\binа такжеgit路径\usr\binТакие как:C:\Program Files\Git\binа такжеC:\Program Files\Git\usr\binСгенерировать открытый ключ:openssl genrsa -out rsa_private_key.pem 1024Сгенерировать закрытый ключ:openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

END

Добро пожаловать на мой блог