Search code examples
vue.jsaxiosvuexvue-router

Attempts with creating authorization to site turns out to: Error POST 404 (OK)


I can't get how to solve problem with POST request. I am trying implement authorization on my site (via Vuejs,vuex,vue-router, axios). I will be very pleasure, if you give me some advice. I searched info on forums , but situation was not the same. Why 404 (OK)? If OK, why 404? It means, that server received my data, but can't compare correct this or not?

I have components/pages:

App.vue

<template>
  <div id="app">
      <div id="nav">
      <router-link to="/">Home page</router-link> |
      <router-link to="/login">Login</router-link>
      <span v-if="isLoggedIn"> | <a @click="logout">Logout</a></span>
    </div>
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App',
  computed : {
      isLoggedIn : function(){ return this.$store.getters.isLoggedIn}
    },
  methods: {
    logout: function () {
      this.$store.dispatch('logout')
      .then(() => {
        this.$router.push('/login')
      })
    }
  },
  created: function () {
    this.http.interceptors.response.use(function (err) {
      return new Promise(function (resolve) {
        if (err.status === 401 && err.config && !err.config.__isRetryRequest) {
          this.$store.dispatch("logout")
          resolve()
        }
        throw err;
      });
    });
  },
}
</script>

LoginAnalytics.vue Here user must input his mobile phone and password.

<template>
 <div>
   <form class="login" @submit.prevent="login">
     <h1>Sign in</h1>
     <label>Mobile</label>
     <input required v-model="mobile" type="tel" placeholder="mobile phone"/>
     <label>Password</label>
     <input required v-model="password" type="password" placeholder="Password"/>
     <hr/>
     <button type="submit">Login</button>
   </form>
 </div>
</template>
<script>
  export default {
    data(){
      return {
        mobile : "",
        password : ""
      }
    },
    methods: {
      login: function () {
        let login = this.mobile 
        let password = this.password
        this.$store.dispatch('login', { login, password })
       .then(() => this.$router.push('/secure'))
       .catch(err => console.log(err))
      }
    }
  }
</script>

Vuex store Here I am creating axios POST requests to server.

import Vue from 'vue';
import Vuex from 'vuex';
import axios from 'axios';
import { API_BASE_URL, TEMPORARY_TOKEN } from '../config';

Vue.use(Vuex);

export default new Vuex.Store({
  state:{
    trainings: [],
    incomings: [],
    sources: [],
    avgShedule: [],
    metro: [],
    conversion: [],
    avgIncome: [],
    status: '',
    token: localStorage.getItem('token') || '',
    user : {},
  },
  mutations:{
    auth_request(state){
      state.status = 'loading'
    },
    auth_success(state, token, user){
      state.status = 'success'
      state.token = token
      state.user = user
    },
    auth_error(state){
      state.status = 'error'
    },
    logout(state){
      state.status = ''
      state.token = ''
    },
  },
  getters:{
    isLoggedIn: state => !!state.token,
    authStatus: state => state.status,
  },
  actions:{
    login({commit}, user){
      return new Promise((resolve, reject) => {
        commit('auth_request')
        axios({
        url: `${API_BASE_URL}/analytics.auth`,
        data: user,
        method: 'POST',
        headers: {
          "Content-Type": "application/x-www-form-urlencoded",
        }
      })
        .then(resp => {
          const token = resp.data.token
          const user = resp.data.user
          localStorage.setItem('token', token)
          axios.defaults.headers.common['Authorization'] = token
          commit('auth_success', token, user)
          resolve(resp)
        })
        .catch(err => {
          commit('auth_error')
          localStorage.removeItem('token')
          reject(err)
        })
      })
    },

    logout({commit}){
    return new Promise((resolve) => {
      commit('logout')
      localStorage.removeItem('token')
      delete axios.defaults.headers.common['Authorization']
      resolve()
    })
    }
  }
},
)

router. There all refs to components and pages

import Vue from 'vue'
import Router from 'vue-router'
import store from '@/store'
import Analytics from '@/pages/Analytics-test.vue'
import LoginAnalytics from '@/components/LoginAnalytics.vue'
import HomeAnalytics from '@/components/HomeAnalytics.vue'

Vue.use(Router)

let router = new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'home',
      component: HomeAnalytics
    },
    {
      path: '/login',
      name: 'login',
      component: LoginAnalytics
    },
    {
      path: '/secure',
      name: 'secure',
      component: Analytics,
      meta: { 
        requiresAuth: true
      }
    },
  ]
})

router.beforeEach((to, from, next) => {
  if(to.matched.some(record => record.meta.requiresAuth)) {
    if (store.getters.isLoggedIn) {
      next()
      return
    }
    next('/login') 
  } else {
    next() 
  }
})


export default router

And also main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router';
import store from './store'
import axios from 'axios'


Vue.config.productionTip = false

Vue.prototype.$http = axios;
const token = localStorage.getItem('token')
if (token) {
  Vue.prototype.$http.defaults.headers.common['Authorization'] = token
}

new Vue({
  store,
  router,
  render: h => h(App),
}).$mount('#app')

Every time, when I am try login me with correct mobile and password, I received error like this:

enter image description here


Solution

  • Problem was with mistake in API endpoint. All times I tried call this url: url: ${API_BASE_URL}/analytics.auth, But correct is: url: ${API_BASE_URL}/account.auth.