Laravel Sanctum возвращает 500 при попытке получить доступ к защищенному API sanctum

#php #laravel #postgresql #laravel-sanctum #laravel-airlock

#php #laravel #postgresql #laravel-sanctum #laravel-воздушный шлюз

Вопрос:

Я использую Laravel 8.12 с PostgreSQL. Я пытаюсь использовать Laravel Sanctum в качестве аутентификации для моего API. Это схема для sanctum:

 <?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseQueryExpression;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreatePersonalAccessTokensTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('personal_access_tokens', function (Blueprint $table) {
            $table->uuid('id')->primary()->default(new Expression("uuid_generate_v4()"));
            $table->uuidMorphs('tokenable');
            $table->string('name');
            $table->string('token', 64)->unique();
            $table->text('abilities')->nullable();
            $table->timestamp('last_used_at')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('personal_access_tokens');
    }
}
  

И это моя таблица пользователей:

 <?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseQueryExpression;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesDB;
use IlluminateSupportFacadesSchema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->uuid('id')->primary()->default(new Expression('uuid_generate_v4()'));
            $table->string('first_name', 255);
            $table->string('last_name', 255);
            $table->string('email', 255)->index()->unique();
            $table->string('password', 100);
            $table->boolean('email_verified')->default(false);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

  

Теперь, когда я пытаюсь отправить токен в заголовках, я получаю эту ошибку: SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for type uuid: "0" (SQL: select * from "personal_access_tokens" where "personal_access_tokens"."id" = 0 limit 1) . С моей точки зрения, похоже, что это ошибка с типом столбца uuid?

Это команда, которую я использую для выполнения запроса:

 curl --request GET 
  --url http://127.0.0.1:3001/api/user 
  --header 'Accept: application/json' 
  --header 'Authorization: Bearer 0|s0Vpci4xXoEJh1HMEihNd65GLvDmINILaiJr8o8e' 
  --header 'Content-type: application/json'
  

Любая помощь будет оценена.

Ответ №1:

создайте файл со следующим содержимым.

 <?php

namespace AppModels;

use LaravelSanctumPersonalAccessToken as SanctumPersonalAccessToken;

class PersonalAccessToken extends SanctumPersonalAccessToken
{
    public $incrementing = true;

    protected $primaryKey = "id";
    protected $keyType = "string";
}
  

и затем я вызываю этот файл PersonalAccessToken . А затем AppServiceProvider сделайте что-то вроде этого.

я вызываю этот файл PersonalAccessToken. А затем в AppServiceProvider сделайте что-то вроде этого:

 <?php

namespace AppProviders;

use AppModelsPersonalAccessToken;
use IlluminateSupportServiceProvider;
use LaravelSanctumSanctum;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        Sanctum::ignoreMigrations();
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class);
    }
}
  

это решит вашу проблему