Laravel + Vue + JWT: как добавить Authorization header?

Добрый день!
Вчера решил подключить к Laravel JWT и переписать авторизацию. До этого использовалась нативная авторизация "из коробки".
Итак, есть роуты:
Route::get('/', ['uses' => 'AuthController@index']);
Route::post('/login', ['uses' => 'AuthController@login']);
Route::get('logout', 'AuthController@logout');
Route::get('/ap', ['uses' => 'APController@index']);

Первый выводит форму входа, вот код Vue, который "обрабатывает" ее:
export default {
        data () {
            return {
                login: '',
                password: ''
            }
        },
        methods: {
            auth () {
                axios.post('/api/login', { login: this.login, password: this.password })
                    .then(function (response) {
                        if (response.data.success) {
                            Cookies.set('Token', 'Bearer ' + response.data.data.token);
                            axios.defaults.headers.common['Authorization'] = 'Bearer ' + response.data.data.token;
                            console.log('Токен выдан')
                        }
                        console.log(response.data.data.token);
                    })
            }
        }
    }

Т.е. я сохраняю JWT в cookies. Авторизация проходит, кука сохраняется. Теперь, после авторизации я хочу перейти по адресу mysite/ap (последний роут, метод GET). Код метода index:
try {
            if (! $user = JWTAuth::parseToken()->authenticate()) {
                return response()->json(['user_not_found'], 404);
            }
        } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
            return response()->json(['token_expired'], $e->getStatusCode());
        } catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
            return response()->json(['token_invalid'], $e->getStatusCode());
        } catch (Tymon\JWTAuth\Exceptions\JWTException $e) {
            return response()->json(['token_absent'], $e->getStatusCode());
        }
        
        return response()->json(compact('user'));

Однако я получаю JWTException
The token could not be parsed from the request
В мануалах сказано, что я должен передавать Authorization header при запросе вида "Authorization: Bearer + myToken". Добавил следующий код в resources\assets\js\app.js
import VueResource from 'vue-resource';
import Cookies from 'js-cookie';
Vue.use(VueResource);
Vue.http.headers.common['Authorization'] = 'Bearer ' + Cookies.get('Token');

Пересобрал (npm run dev), однако header не вставляется и как результат - после успешной авторизации я не получаю доступ к части сайта, где требуется передать JWT по причине того, что я не могу вставить Authorization header, он не вставляется.
Поставил ModHeader для Chrome, прописал там header с токеном, выданным после авторизации - все работает.
И собственно вопрос: каким образом можно добавить Authorization header в GET-запрос? Что я делаю не так? :(
Заранее благодарен за ответы.
  • Вопрос задан
  • 5132 просмотра
Пригласить эксперта
Ответы на вопрос 2
Froks
@Froks
Используй лучше стандартный passport laravel, а не tymon сторонний
Ответ написан
Комментировать
@HeyAway
Два варианта:

В запрос:
axios({
        method: 'post', // Or GET
        url: this.$root.api.get_featured,
        headers: { 'Authorization': 'Bearer ' + this.$root.api.access_token } // Cookies.get('Token')
      })


Общий. После подключения axios, ставьте:
axios.defaults.headers.common['Authorization'] = 'Bearer ' + Cookies.get('Token');


Оба варианта у меня исправно работают.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы