Проблема с аутентификацией с laravel и vuejs - PullRequest
0 голосов
/ 09 марта 2020

Я выполнил аутентификацию в laravel в качестве бэкэнда и vueJs в веб-интерфейсе. Я использовал jwt пакет. Так что все запросы на регистрацию, вход в систему и выход из системы работают.

Что я сделал, так это то, что клиент вводит свою почту и пароль при входе в систему; он проверяет его в DB и, если все в порядке, возвращает токен и сохраняет его в документе cook ie. Когда клиент выйдет из системы, токен будет удален с повара ie.

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

I Также проверил локальное хранилище, очистил кеш браузера и проекта.

Это мой код:
В серверной части: контроллер:

<?php
namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
//use Illuminate\Support\Facades\Hash;
use App\User;
class AuthController extends Controller
{
    /**
     * Create a new AuthController instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:api')->except(['login','register','logout']);
    }

    /**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function register()
    {

        User::create([
            'name' => request('name'),
            'email' => request('email'),
            'password' => \Hash::make(request('password'))
        ]);

        return $this->login(request());
    }


    /**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login()
    {
        $credentials = [
            'email' => request('email'),
            'password' => request('password'),
        ];

        $token = auth()->attempt($credentials);
        if (!$token) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }
        return $this->respondWithToken($token);
    }

    /**
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        return response()->json(auth()->user());
    }

    /**
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        auth()->logout();
        return response()->json(['message' => 'Successfully logged out']);
    }

    /**
     * Refresh a token.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth()->refresh());
    }

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => $this->guard()->factory()->getTTL() * 60,
            'user' => auth()->user()
        ]);
    }

    /**
     * Get the guard to be used during authentication.
     *
     * @return \Illuminate\Contracts\Auth\Guard
     */
    public function guard()
    {
        return Auth::guard();
    } }

скрипт страницы входа в систему:

export default {
  name: 'login-page',
  bodyClass: 'login-page',
  components: {
    Card,
    MainFooter,
    [Button.name]: Button,
    [FormGroupInput.name]: FormGroupInput,
    Alert,
  },
    data(){
      return {
        user:{
          email:"",
          password:""
        },
        error:"",
      }
    },
    methods:{
      login(){
        if (!this.user.email && !this.user.password ) {
           this.errors.push('email or Password required.');
        } else {
          axios.post('http://localhost:8000/api/auth/login',{
            email:this.user.email,
            password:this.user.paswword
        }).then(response =>{
          console.log(response.data);
          this.$store.state.token =response.data.access_token
          this.$store.commit("loginSuccess", response);
         this.$router.push({ name: 'profile'});
        }).catch(error=>{
        console.log(error.message)
        })
        console.log("login function");
        }
      },

    }

};

скрипт выхода из системы

data(){
    return{
      logoutMsg:"",
      }
    },
    methods:{
         logout(){
          axios.post('http://localhost:8000/api/auth/logout',{token:this.$store.state.token}).then(response =>{
            console.log(response.data.message);
            this.logoutMsg = response.data.message;
            this.$store.commit('logout');
            this.$router.push({name: 'login', params: {logoutState: true , message: this.logoutMsg} });
          }),
          console.log( this.$store.state.isLoggedIn + "  // logout function");
        }
    }
};

в магазине. js

import { getLocalUser } from "./helpers";

const user = getLocalUser();

export default({

    state: {
        isLoggedIn: !!user,
        token:user,
    },
    getters:{
        isLoggedIn(state) {
            return state.isLoggedIn;
        },
        token(state) {
            return state.token;
        },
    },
    mutations:{
            loginSuccess(state, payload) {
                state.isLoggedIn = true;
                document.cookie = state.token;+"expires= Thu, 21 Aug 2014 20:00:00 UTC"
                //localStorage.setItem("user", state.currentUser);
            },
            logout(state) {
                //localStorage.removeItem("user");
                document.cookie = "; expires = Thu, 01 Jan 1970 00:00:00 GMT"
                state.isLoggedIn = false;
                state.currentUser = null;
                state.token = null;
            },

    },
    actions:{
        login(context) {
            context.commit("login");
        },

    },
  });

помощников. js

export function getLocalUser() {
    const userStr = document.cookie

    if(!userStr) {
        return null;
    }

    return userStr;

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Так что это была проблема с выходом из системы, но не только. на самом деле «этот пароль» в моем логине и компоненте регистра был с синтаксической ошибкой.

0 голосов
/ 14 марта 2020

Вам необходимо сделать недействительным токен авторизации.

Добавить это в функцию logout ():

$token = auth()->tokenById(auth()->user()->id);
auth()->invalidate($token);
auth()->invalidate(true);
auth()->logout();
...