Laravel - возврат HTTP-клиента 403 - PullRequest
0 голосов
/ 25 марта 2020

У меня есть проект с Laravel для управления вызовами конечной точки и Vue для управления внешним интерфейсом.

Когда пользователь выполняет вход в систему, ответ ( токен ), сохраненный в localStorage , затем в приложении. js я автоматически добавляю этот токен ко всем вызовам.

Логин

  axios
        .post("http://127.0.0.1:8000/api/login", {
          username: this.username,
          password: this.password
        })
        .then(response => {
          if (response.data.token != null) {
            localStorage.setItem("token", response.data.token);
            //PUSH SECOND PAGE
          }
        })

Приложение. js

const token = localStorage.getItem('token')

if (token) {
    axios.defaults.headers.common['Authorization'] = "Token " + token
}

Теперь мы увидим проблему.

Когда мы go на второй странице вызов конечной точки будет запущен автоматически для заполнения некоторых входов. Этот вызов теоретически имеет токен localStorage.

 mounted() {
    axios
      .get("http://127.0.0.1:8000/api/elements")
      .then(response => {
        console.log(response.data);
      })
      .catch(function(error) {
        console.log(error);
      });
  }

Маршруты (конечные точки API)

Route::get('elements', 'HeaderController@elements')->name('header.elements');

HeaderController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;

class HeaderController extends Controller
{
    public function elements()
    {
        $response = Http::get('API');
        return $response->json();
    }
}

Возвращает Доступ запрещен . Токен сообщается в шапке.

Любопытно, но если мы обратимся напрямую к API через Ax ios, ответ будет правильным, но если мы используем Laravel конечную точку, вернем этот Отказ в доступе.

Итак: Кто-нибудь видит Ошибка? Почему ax ios возвращает правильный ответ, а Laravel возвращает 403?

UPDATE 1

LoginController Laravel Класс

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
//use Illuminate\Foundation\Auth\AuthenticatesUsers;

use App\Http\Requests\LoginRequest;

use Illuminate\Support\Facades\Http;

class LoginController extends Controller
{
   // use AuthenticatesUsers;

    protected $redirectTo = RouteServiceProvider::HOME;

   /* public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }*/

    public function login(LoginRequest $request)
    {
        $response = Http::post('API', [
            'username' => $request->username,
            'password' => $request->password,
        ]);
        return $response->body();
    }
}

ОБНОВЛЕНИЕ 2 ( Игнорировать это, я исправляю это )

Когда я вызываю API через Топор ios имеет

Content-Type: application / json

если я использую Laravel конечная точка имеет

Content-Type: text / html; charset = UTF-8

ОБНОВЛЕНИЕ 3

Массив, ожидаемый в ответе конечной точки

{
    "code": 0,
    "message": "",
    "body": [
        {
            "id": 1,
            "entity": "Test1",
            "agrupations": [
                {
                    "id": 6,
                    "name": "A"
                },
                {
                    "id": 7,
                    "name": "B"
                }
            ]
        },
        {
            "id": 2,
            "entity": "Test2",
            "agrupations": [
                {
                    "id": 8,
                    "name": "C"
                },
                {
                    "id": 9,
                    "name": "D"
                }
            ]
        },
        {
            "id": 3,
            "entity": "Test3",
            "agrupations": [
                {
                    "id": 1,
                    "name": "E"
                },
                {
                    "id": 11,
                    "name": "F"
                }
            ]
        },
        {
            "id": 4,
            "entity": "Test4",
            "agrupations": [
                {
                    "id": 10,
                    "name": "G"
                }
            ]
        }
    ]
}

ОБНОВЛЕНИЕ 4

Я комментирую auth route, чтобы избежать конфликтов маршрутов

Web. php

//Auth::routes();

enter image description here

ОБНОВЛЕНИЕ 5

Полный cURL.

Мммм, может быть Laravel X-XSRF-TOKEN и SRF-TOKEN что-то сломали.

Это не работает (с использованием Laravel для конечной точки)

curl 'http://127.0.0.1: 8000 / api / elements ' -H 'Соединение: поддержания активности '-h 'DNT: 1' -H 'X-XSRF-ЗНАК: eyJpdiI6IjV4aU9qOXpaY2FoLytIQ1RTSi9jZGc9PSIsInZhbHVlIjoiWTlmOUcwL21Ld0xVYXZwdWZyVDJhVktzczlJSzVtdHE2UUsvREp3Nm51RjBZYStaaXptYmx0N0F0bzVkWTQvQiIsIm1hYyI6IjE3OWFiOGU5ZjFjZDhhMDc4OTUzYmJjZDUxZWYwMWY3MzgyOTg3YjM0MjFlNjk5MTc0MGExZDNmYmQ2YzIzY2IifQ ==' -H' Разрешение: Токен eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE1ODUxNTYzMjgsImlzcyI6Imh0dHBzOi8vd3d3LmFyc29uLmNvbS8iLCJzdWIiOiJhbGFyYSIsImV4cCI6MTU4NjAyMDMyOH0.Mv968xR4IA dbkgqABvg2CLNxSc6mkFPxqEKm9VbbFYOg-H5Ppo80DEsoj8F8pT2yoY7LHF5P_zMbWymAwxPzvQ '-H' Принять: приложение / json, текст / обычный, / .0: Mo: агент 10: 10 * (*): агент *: 10 * (*): агент *: 10 * (*): агент * Windows 5.0 -H Win64; x64) AppleWebKit / 537.36 (K HTML, как Gecko) Chrome / 80.0.3987.149 Safari / 537.36 '-H' Se c -Fetch-Dest: пусто '-H' X-Requested-With: XMLHttpRequest '-H 'Se c -Fetch-Site: тот же источник' -H 'Se c -Fetch-Mode: cors' -H 'Ссылка: http://127.0.0.1: 8000 / lora / ' -H 'Accept-Language: ES-ES, ES, Q = 0,9, ан; д = 0,8' -H «Кук ie: XSRF-ЗНАК = eyJpdiI6IjV4aU9qOXpaY2FoLytIQ1RTSi9jZGc9PSIsInZhbHVlIjoiWTlmOUcwL21Ld0xVYXZwdWZyVDJhVktzczlJSzVtdHE2UUsvREp3Nm51RjBZYStaaXptYmx0N0F0bzVkWTQvQiIsIm1hYyI6IjE3OWFiOGU5ZjFjZDhhMDc4OTUzYmJjZDUxZWYwMWY3MzgyOTg3YjM0MjFlNjk5MTc0MGExZDNmYmQ2YzIzY2IifQ% 3D% 3D; lorawan_session = eyJpdiI6IjZEa1ZQWkY1ZHhYamxPaUxSWGFvdUE9PSIsInZhbHVlIjoiaGltclROWnZPTWR4TWZZa3VzcUU4ekZjUklUUWlSNGo5U1pPM1ZLcVpJU0NoVS9ma1hmTS9reW1ENWNWMHJNcSIsIm1hYyI6ImUyYWVkZmUxYTk2M2IzMWQ5MTkyY2RkYzZjZDA3N2U5YTdjNDhiYzliNGQzZjEzOGYzMjFiODJhZWFlMjE3ODcifQ% 3D% 3D»--compressed

Данная работа (с использованием Ax ios позвонить непосредственно API)

локон "API" -H«Подключение : keep-alive "-H" Принять: application / json, текст / обычный, /"-H" Se c -Fetch-Dest: empty "-H" X-Requested-With : XMLHttpRequest "-H" Авторизация: Токен eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE1ODUxNTcyODksImlzcyI6Imh0dHBzOi8vd3d3LmFyc29uLmNvbS8iMyYIIIIIIIIIIIIIIIIIIIIIIIIIII6IIIIIIIIIII6I 9MfXYgBDhYltmbfz7rwFWhL0dQUFFRO43ioK8cVlM2C1_-9GolXeC9e55hEclmP4bTuGWfS5HOj9SOWXiDowLA "-H" Пользователь-агент: Mozilla / 5.0 (Sa5) * 53 * 68) 685: 68.0: 68.0: 68.67: 68.0: 68.0: 68.0: 68.0: 68.0: 68.0: 68.65: 68.0: 68.0: 68.0: 68.67: 68.0: 68.67: 68.0: 68.67: 64.0: 68.67: 68.0: 68.67: 68.0: 68.67 : 1 "-H" Происхождение: http://127.0.0.1: 8000"-H" Se c -Fetch-Site: кросс-сайт "-H" Se c -Fetch-Mode: cors " -H "Referer: http://127.0.0.1: 8000 / lora / " -H "Accept-Language: es-ES, es; q = 0,9, en; q = 0,8" - сжатый

1 Ответ

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

Обновите заголовок вашего топора ios до токена на предъявителя.

axios.defaults.headers.common['Authorization'] = "Bearer " + token

https://laravel.com/docs/6.x/api-authentication#passing -token-in-request

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...