vue+koa+mysqlエンタープライズ管理バックグラウンド


1、ドメイン間セッションの失効問題原因:ドメイン間リクエスト、デフォルトではクッキーを携帯させないため、サービス側で設定されたセッションを取得できない(同じgetリクエストで取得でき、同じpostで取得できるが、getで設定されたセッションはpostでは取得できない)解決方法:vueフロントリクエストブロッカーでwithCredentials=trueを設定する
// request   
service.interceptors.request.use(config => {
  if (store.getters.token) {
    config.headers['X-Token'] = getToken() //           token            
  }
  config.withCredentials = true //       cookie
  return config
}, error => {
  console.log('lan')
  // Do something with request error
  console.log(error) // for debug
  Promise.reject(error)
})

koaバックグラウンドでドメイン間パラメータを設定する
const cors = require('koa2-cors');

app.use(cors({
    origin: function (ctx) {        
        return 'http://localhost:9528';//      
    },
    exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
    maxAge: 5,
    credentials: true,
    allowMethods: ['GET', 'POST'],
    allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
}))

2、jwtを使用してログイン検証を行い、anthorization error 401エラー原因:先にjwt検証を行い、ドメイン間処理を行い、正しい順序は先にドメイン間処理を行ってから検証処理とjwt処理を行うべきである
npm i jsonwebtoken --save
npm i koa-jwt --save

const err = require('./middlreware/error');

//       error,js
const jwt = require('jsonwebtoken')
const config = require('../config/config')
const util = require('util')
const verify = util.promisify(jwt.verify)

/**
 *   token    
 */
module.exports = function () {
    return async function (ctx, next) {
        try {
            const token = ctx.header.authorization  //   jwt
            if(token) {
                let payload
                try {
                    payload = await verify(token.split(' ')[1], config.session.sign)  //   payload,      ID
                    ctx.user = {
                        name: payload.name,
                        id: payload.id
                    }
                } catch (err) {
                    console.log('token verify fail: ', err)
                }
            }
            console.log(`token: ${token}`)

            await next()
        } catch (err) {
            if (err.status === 401) {
                ctx.body = {
                    code: -1,
                    message: '    '
                }
            } else {
                err.status = 404
                ctx.body = '404'
                console.log('     :', err)
            }
        }
    }
}


//              
app.use(err())
app.use(jwtKoa({secret: config.session.sign}).unless({
    path: [/^\/api\/login/,/^\/api\/login\/getCaptcha/] //           jwt  
}))