Как я могу получить доступ к маршрутам API с помощью Laravel Sanctum без SPA или графического интерфейса, только с помощью POSTMAN?

Я впервые работаю с Laravel Sanctum, особенно с API. Мне пришлось создать API, предназначенный только для отчетов, который возвращает JSON, тему, к которой я не могу получить доступ с помощью POSTMAN, поскольку он говорит мне "message": "Unauthenticated."

Я выполнил шаги для конфигурации, которые мне рассказала документация в моем проекте.

Я следовал шагам конфигурации, описанным в документации в моем проекте, который заключался в установке святилища, запуске провайдера, создании миграции токена, ссылке в модели святилища пользователя и размещении HasApiTokens, на данный момент я не знаю, что делать больше.

С одной стороны, документация говорит мне, что я могу получить доступ, поместив эту строку token = $user->createToken('token-name');, но я не знаю, где ее разместить, потому что у нее не будет интерфейса, поскольку цель - доступ через PowerBi.

Это мой API маршрута

Route::group(['middleware'=> 'auth:sanctum'], function (){
    Route::get('/reports','Api\ReportController@getTicketsCotizados');
});

Мой контроллер

    public function __construct()
    {
        $this->middleware('auth');
    }

    public function getTicketsCotizados(){

        $this->authorize('view ticket');

        $cotizados =Ticket::ticketWithLeadForStatus(3)->get();
        return response()->json($cotizados, 200);
    }

ядро

'api' => [
            EnsureFrontendRequestsAreStateful::class,
            'throttle:60,1',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

Пользователь

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use Notifiable, UsesTenantConnection, HasApiTokens, HasRoles;
(...)
}

Охранники

'api' => [
            'driver' => 'sanctum',
            'provider' => 'users',
            'hash' => false,
        ],

Почтальон введите здесь описание изображения


person Alex Valenzuela    schedule 21.09.2020    source источник


Ответы (2)


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

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

В вашем случае вы можете использовать TINKER ( интерактивную оболочку laravel ) для быстрого создания токена и просто для теста, просто введите следующее в командной строке в корне вашего проекта:

php artisan tinker
$user = User::find([replace_with_user_accessing_api_id]);
$user->createToken('[replace_with_random_name]');

Теперь вы можете получить plainTextToken и разместить его на вкладке Авторизация Postman в разделе Тип носителя.

person Carlos Salles    schedule 16.04.2021

Если вы читаете документацию Laravel здесь https://laravel.com/docs/8.x/sanctum у него есть очень наглядный пример создания токена доступа и выполнения запроса с его помощью. Да, нет четкого примера выполнения запроса, и он просто относится к использованию токена на предъявителя, потому что они предполагают, что вы хорошо разбираетесь в таких вещах.

Чтобы в полной мере использовать универсальный фреймворк, такой как Laravel, вам нужно внимательно просмотреть каждую страницу о чем-то и не пропустить ни одной информации или слова, которые они написали, чтобы помочь вам с чем-то.

Следуя части контроллера/маршрутов, где вы создаете токен. Они написали его для использования в маршруте, но вы можете переместить его в контроллер, если вы можете следовать основам laravel.

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;

Route::post('/sanctum/token', function (Request $request) {
    $request->validate([
        'email' => 'required|email',
        'password' => 'required',
        'device_name' => 'required',
    ]);

    $user = User::where('email', $request->email)->first();

    if (! $user || ! Hash::check($request->password, $user->password)) {
        throw ValidationException::withMessages([
            'email' => ['The provided credentials are incorrect.'],
        ]);
    }

    return $user->createToken($request->device_name)->plainTextToken;
});

Помните, что когда генерируется токен, это единственный раз, когда вы можете просмотреть простой токен для дальнейшего использования. См. PlainTextToken в приведенном выше коде. Если вы не сохраните этот токен, вы не сможете его использовать.

Хорошо. Я предполагаю, что вы видите и копируете этот токен, который выглядит как 123|p45xhFOkNFPXR7QhXjupWRffKDds2b7dpXDB0Vzz. В этом токене 123 в начале — это идентификатор пользователя, разделенный вертикальной чертой (|). Вам нужно извлечь его, чтобы использовать только токен, который в этом примере начинается с p45.

В реальном приложении вы передаете/возвращаете этот токен в запрос на вход с мобильного устройства или во внешний интерфейс и сохраняете его в сеансе или в соответствующем хранилище данных.

Затем, чтобы сделать дальнейшие запросы к маршрутизируемым областям/URL-адресам, охраняемым auth:sanctum, вы должны передать этот токен через заголовок авторизации в форме носителя. См. Настройка заголовка авторизации в Fetch API для примера использования метода fetch. Я отправляю картинку, показывающую, как вы могли бы назвать это в почтальоне.

введите здесь описание изображения

Если я сделаю этот запрос без установки заголовка авторизации, он также вернет мне

{
    "message": "Unauthenticated."
}

Надеюсь, я был достаточно ясен.

person Arvind K.    schedule 28.05.2021