У меня есть служба stats , которая извлекает данные из postgres, работающей на localhost:3030/stats
, я также настроил другую службу, которую я хочу использовать в качестве службы аутентификации на localhost:3030\users
, у меня есть установочные перья. js backend и все работает, я также добавил аутентификацию для этих сервисов, поэтому при попытке получить прямой доступ к ним появляется сообщение 401 Forbidden
. Ниже показан перо Backend app.js
const path = require('path');
const io = require('socket.io-client');
const favicon = require('serve-favicon');
const compress = require('compression');
const helmet = require('helmet');
const cors = require('cors');
const logger = require('./logger');
const feathers = require('@feathersjs/feathers');
const configuration = require('@feathersjs/configuration');
const express = require('@feathersjs/express');
const socketio = require('@feathersjs/socketio');
const middleware = require('./middleware');
const services = require('./services');
const appHooks = require('./app.hooks');
const channels = require('./channels');
const authentication = require('./authentication');
const sequelize = require('./sequelize');
const socket = io('http://api.feathersjs.com');
const app = express(feathers());
// Load app configuration
app.configure(configuration());
// Enable security, CORS, compression, favicon and body parsing
app.use(helmet());
app.use(cors());
app.use(compress());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(favicon(path.join(app.get('public'), 'favicon.ico')));
// Host the public folder
app.use('/', express.static(app.get('public')));
// Set up Plugins and providers
app.configure(express.rest());
// app.configure(socketio());
app.configure(socketio(socket, {timeout: 10000}));
app.configure(sequelize);
// Configure other middleware (see `middleware/index.js`)
app.configure(middleware);
app.configure(authentication);
// Set up our services (see `services/index.js`)
app.configure(services);
// Set up event channels (see channels.js)
app.configure(channels);
// Configure a middleware for 404s and the error handler
app.use(express.notFound());
app.use(express.errorHandler({ logger }));
app.hooks(appHooks);
module.exports = app;
У меня есть настроенный интерфейс Vuex, где я использую эти сервисы для создания панели мониторинга, теперь я хочу добавить страницу входа в систему до доступа к панели мониторинга. Я пытался следовать этому учебнику
Взгляните на
Login.vue
<template>
<v-app>
<v-container fluid>
<v-slide-y-transition mode="out-in">
<v-layout column align-center>
<v-form
v-model="valid"
@submit.prevent="login({ valid, user })"
@keydown.prevent.enter>
<v-text-field
v-model="user.email"
:rules="notEmptyRules"
label="Username"
required
></v-text-field>
<v-text-field
v-model="user.password"
:rules="notEmptyRules"
label="Password"
type="password"
required
></v-text-field>
<v-btn type="submit" :disabled="!valid">Login</v-btn>
</v-form>
</v-layout>
</v-slide-y-transition>
</v-container>
</v-app>
</template>
<script>
import { mapState, mapActions } from 'vuex';
import { notEmptyRules } from '@/validators';
export default {
name: 'login',
data: () => ({
valid: false,
user: {
email: '',
password: '',
},
notEmptyRules,
}),
computed: {
},
methods: {
...mapActions('localAuth', ['login']),
},
};
</script>
App.vue
<template>
<v-app>
<v-layout>
<app-navbar :user="user" :logout="handleLogout">
</app-navbar>
</v-layout>
<router-view></router-view>
</v-app>
</template>
<script>
import { mapActions, mapState } from 'vuex';
import AppNavbar from '@/components/AppNavbar';
import store from './store';
export default {
name: 'App',
components: {
AppNavbar,
},
data() {
return {
fixed: false,
};
},
computed: {
user () {
return this.$store.state.auth.user
}
},
methods: {
...mapActions('auth', [ 'logout' ]),
handleLogout () {
this.logout()
.then(_ => {
this.$router.push('/')
})}
},
};
</script>
store.js
import Vue from 'vue';
import Vuex from 'vuex';
import feathersVuex from 'feathers-vuex';
import feathersClient from './feathers-client';
const { service, auth, FeathersVuex } = feathersVuex(feathersClient, { idField: '_id' });
Vue.use(Vuex);
Vue.use(FeathersVuex);
export default new Vuex.Store({
plugins: [
service('realtime_stats', {
instanceDefaults: {
statid: '',
oldcount: '',
inserted: '',
updated: '',
deleted:'',
newcount:'',
createdAt:'',
updatedAt:'',
}}),
service('joblog', {
instanceDefaults: {
jobid: '',
jobname: '',
jobstatus: '',
createdAt: '',
updatedAt:'',
}}),
service('monthly_stats',{
instanceDefaults:{
statid:'',
stats:'',
createdAt:'',
updatedAt:''
}
}),
service('daily_count',{
instanceDefaults:{
txcount:'',
pdxcount:'',
dates:'',
createdAt:'',
updatedAt:''
}
}),
auth({ userService: 'users' }),
],
});
main.js
import Vue from 'vue';
import App from './App.vue';
import router from './router';
// import store from './store/index';
import store from './store';
import vuetify from './plugins/vuetify';
Vue.config.productionTip = false;
router.beforeEach((to, from, next) => {
const currentUser = store.state.auth.user;
const requiresAuth =to.matched.some(record => record.meta.requiresAuth);
if (requiresAuth && !currentUser) {
next('/');
} else {
next();
}
});
// store.dispatch('auth/authenticate').then(res=>{
// console.log(res);
new Vue({
router,
store,
vuetify,
render: h => h(App)
}).$mount('#app');
// });
// // Auth first before loading the app
// store.dispatch('auth/authenticate')
// .catch(() => {})
// // Render the app
// .then(() => {
// // eslint-disable-next-line no-new
// new Vue({
// router,
// store,
// render: h => h(App)
// }).$mount('#app');
// });
router.js
import Vue from 'vue';
import Router from 'vue-router';
import Login from './views/Login.vue';
import stats from './views/stats.vue';
import Signup from './views/SignUp.vue';
import store from './store';
Vue.use(Router);
const router = new Router({
mode: 'history',
routes: [
{
path: '/login',
name: 'login',
component: Login,
},
{
path:'/signup',
name:'signup',
component : Signup,
},
{
path: '/stats',
name: 'stats',
component: stats,
},
{
path: '*',
redirect: '/login'
}
],
});
router.beforeEach((to, from, next) => {
store.dispatch('fetchAccessToken');
if (to.fullPath === '/users') {
if (!store.state.accessToken) {
next('/login');
}
}
if (to.fullPath === '/login') {
if (store.state.accessToken) {
next('/users');
}
}
next();
});
export default router;
, но когда я запускаю это, я получаю следующую ошибку
Iпопробовал, но не смог заставить это работать, пожалуйста, дайте мне знать, как я могу заставить это работать.