找不到护照Laravel createToken个人访问客户端

dad*_*jar 8 laravel laravel-passport

设置好护照后,我已经配置并创建了一个控制器,用于管理对一般外部邮寄请求的资源的“注册-登录--”访问。我不需要特定的客户。但是,当我尝试在注册或登录中创建令牌时:

$tokenObj=$user->createToken('APPLICATION')->accessToken;
Run Code Online (Sandbox Code Playgroud)

错误是:

RuntimeException:找不到个人访问客户端。请创建一个。在第94行堆栈C:\ xampp7.1 \ htdocs \ passport \ vendor \ laravel \ passport \ src \ ClientRepository.php中的堆栈跟踪:1. RuntimeException->()C:\ xampp7.1 \ htdocs \ passport \ vendor \ laravel \ passport \ src \ ClientRepository.php:94 2. Laravel \ Passport \ ClientRepository-> personalAccessClient()C:\ xampp7.1 \ htdocs \ passport \ vendor \ laravel \ passport \ src \ PersonalAccessTokenFactory.php:71

我该如何解决?

Rub*_*nce 26

对我来说,它通过运行解决了

php artisan passport:install
Run Code Online (Sandbox Code Playgroud)

因为它是在刷新数据库后发生的。


Jah*_*ion 8

我应该打电话吗

php artisan passport:install
Run Code Online (Sandbox Code Playgroud)

每次我跑步

php artisan:migrate
Run Code Online (Sandbox Code Playgroud)

有办法正确地做到这一点吗?

  • 我认为你只需要在运行“php artisan migrate:fresh”之后运行“php artisan Passport:install --force”。 (2认同)

sta*_*ote 7

运行命令后

php artisan passport:client --personal
Run Code Online (Sandbox Code Playgroud)

并给你这个提示

 What should we name the personal access client? [Artisan Personal Access Client]:
Run Code Online (Sandbox Code Playgroud)

别担心,只需输入任何名称并按回车键即可。

  • 如果您不担心名称,只需使用“php artisan Passport:client --personal --no-interaction” (6认同)

lor*_*isp 7

特质

有时会混淆用户模型的特征。

Sanctum 和 Passport 具有相同的特质,称为HasApiToken

您可能需要更改用户模型中的命名空间:

use Laravel\Sanctum\HasApiTokens;
Run Code Online (Sandbox Code Playgroud)

use Laravel\Passport\HasApiTokens;
Run Code Online (Sandbox Code Playgroud)

使用 PAC 进行测试

在实现单元测试时,您可以创建一个测试来创建一个personal-access-client太:

如果您在数据库中散列您的秘密,如果您需要未散列的密码,则应该在测试用例中设置Passport::$hashesClientSecretsfalse

use RefreshDatabase

/** @test */
public function can_create_a_personal_access_client()
{
    Passport::$hashesClientSecrets = false;

    $this->artisan(
        'passport:client', 
        ['--name' => config('app.name'), '--personal' => null]
    )->assertSuccessful();


    $this->assertDatabaseCount(PersonalAccessClient::class,1);
}
Run Code Online (Sandbox Code Playgroud)

因为我们使用该RefreshDatabase特征,所以为可能需要的其他测试创建辅助特征非常有用personal-access-client

<?php

namespace Tests;

use App\Models\User;
use Illuminate\Testing\TestResponse;

trait Helper
{
    protected function createPersonalClient()
    {
        Passport::$hashesClientSecrets = false;

        $this->artisan(
            'passport:client',
            ['--name' => config('app.name'), '--personal' => null]
        );

        // use the query builder instead of the model, to retrieve the client secret
        return DB::table('oauth_clients')
            ->where('personal_access_client','=',true)
            ->first();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以将该类重新用于其他 PAT 测试:

use RefreshDatabase, Helper;

/** @test */
public function can_issue_a_personal_access_token()
{
    $this->createPersonalClient();

    $user = User::factory()->create()->createToken('test');
    
    $this->assertInstanceOf(PersonalAccessTokenResult::class, $user);

    $this->assertObjectHasAttribute('accessToken', $user);
    
    $this->assertObjectHasAttribute('token', $user);
}
Run Code Online (Sandbox Code Playgroud)


Rus*_*Sk. 6

除了namelivia的评论。正如Laravel博士所说:

在您的应用程序可以发布个人访问令牌之前,您将需要创建个人访问客户端。您可以使用带--personal选项的passport:client命令执行此操作。如果您已经运行passport:install命令,则无需运行此命令:

php artisan passport:client --personal
Run Code Online (Sandbox Code Playgroud)

但是,如果您没有运行命令:

php artisan passport:install
Run Code Online (Sandbox Code Playgroud)

您应该先运行它。

  • 如果您不担心名称,只需使用“php artisan Passport:client --personal --no-interaction” (3认同)

小智 6

只需运行这个命令

php artisan passport:install --force
Run Code Online (Sandbox Code Playgroud)


nam*_*via 5

您必须先创建访问客户端。它记录在这里。一个访问客户端与一个用户令牌不同,您可以有一个访问客户端,并且许多用户使用不同的密码和令牌。