Промежуточное программное обеспечение, которое проверяет токен, не может перенаправить на страницу входа - PullRequest
0 голосов
/ 16 марта 2020

Я использую узел и express с vue. Я пытаюсь реализовать промежуточное программное обеспечение для маршрутов моего узла, проверить маркер входа в систему и, если оно не так, перенаправить на страницу входа.

Это мой код.

Main app.js file

const express = require('express');
const path = require('path');
const cors = require('cors');
const http = require('http'); 
const bodyParser = require('body-parser');  

const app = express(); 

app.use(cors());

app.use(express.static(path.join(__dirname,'public'))); 
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:false}));
app.use(express.json());
app.use(express.urlencoded({extended:false})); 

app.use('/login', require('./routes/login'));
app.use('/performance', require('./routes/performance')); 

 const port = 4000;

 http.createServer(app).listen(port, ()=>{
    console.log('server runs on port ', port);
 });

Тогда в моих маршрутах у меня есть

const express = require('express');
const token = require('../../lib/token');

router.get('/:product/dataquality/', token.validate(), (req, res)=>{   
  const product = req.params.product; 

  db.dataquality(product)
  .then((resolved)=>{   
    console.log('route dataquality result', resolved);
    res.json({success:true, data:resolved});
  })
  .catch((error)=>{
    console.log('route dataquality error', error);
    res.json({success:false, data:false});
  });
});

И это token.validate связующее ПО

const jwt = require('jsonwebtoken');
const config = require('../db/config');
const validate = ()=>{
  return (req, res, next)=>{

    const token = req.get('Authorization');
    const key = config.key;

    jwt.verify(token, key,function(err, decoded) {
      if (err){
        console.log('token error');
        res.redirect('/login');
      } 
      if (decoded){ 
        console.log('token ok');
        next();
      } 
    });
  }
}

exports.validate = validate;

Это работает нормально, и я вижу журналы консоли токена при входе в свое приложение. Если я go ввел в браузер и отредактировал токен (удалил пару символов, но не удалил его полностью), чтобы токен был, но это неправильный токен, он имеет неправильное значение: я вижу в своей консоли token error и я не получаю данных, но перенаправление на страницу входа никогда не происходит. Если я сделаю res.redirect('http://localhost:8080/login');, я все еще не получу перенаправление.

Что мне не хватает? Как я могу это исправить?

Если вы считаете, что это проблема Vue, дайте мне знать, чтобы я мог предоставить Vue код маршрутизации.

Спасибо

РЕДАКТИРОВАТЬ

Этот файл, который обрабатывает маршруты в Vue - router.js

import Vue from 'vue'
import Router from 'vue-router' 
import store from '@/components/store';

import Login from './components/Login.vue'
import Performance from './views/Performance.vue'

Vue.use(Router)

const router =  new Router({
  mode: "history",
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/login',
      name: 'login',
      component: Login,
    },    

    {
      path: '/performance',
      name: 'performance',
      component: Performance,
      beforeEnter: (to, from, next) => { 
        if (store.state.login.token == null || !store.state.login.token) {
          next('/login');
        }
        else{next();}
      }
    },

    {
      path: '*',
      redirect: '/login'
    }
  ]
})    


router.beforeEach((to, from, next) => {
  store.dispatch('resetAccessToken');
  if (to.fullPath === '/performance') {
    if (!store.state.login.token) {
      console.log('VUE route go to login');
      next('/login');
    }
  }
  if (to.fullPath === '/login') {
    if (store.state.login.token) {
      console.log('VUE route browse normally');
      next('/performance');
    }
  }
  next();
});

Если я ищу "route" в консоли браузера, чтобы найти console.log('VUE route go to login'); или console.log('VUE route browse normally'); он говорит, что нашел 160, но я не вижу ни одного.

Я все еще не получаю данных, но могу нормально просматривать пустые Vue страницы. Переадресация узла или Vue должна сработать и отправить меня для входа, но ни один не работает, так что я все еще могу просматривать.

Спасибо

...