护照 Laravel createToken:个人访问客户端未找到。

68

进行了护照设置后,我配置并创建了一个控制器来管理注册、登录和一般外部POST请求的资源访问。我不需要针对特定客户端。但是当我尝试在注册或登录中创建令牌时:

$tokenObj=$user->createToken('APPLICATION')->accessToken;
错误信息为:

RuntimeException: 个人访问客户端未找到,请创建一个。文件路径:C:\xampp7.1\htdocs\passport\vendor\laravel\passport\src\ClientRepository.php中的第94行。 堆栈追踪: 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

如何解决该问题?
8个回答

152

对我来说,问题通过运行得到了解决。

php artisan passport:install

因为这是在我刷新数据库之后发生的。


在刷新数据库后自动运行此命令的方法是什么? - Floris

45

除了namelivia的评论外,Laravel文档还说:

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

php artisan passport:client --personal

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

php artisan passport:install

首先您需要运行它。


3
如果您不担心名称,只需使用 php artisan passport:client --personal --no-interaction - Ben Gooding

41

首先需要创建访问客户端,具体操作可以查看这里的文档。访问客户端和用户令牌不同,你可以拥有一个访问客户端但有多个拥有不同密码和令牌的用户。


对于 Laravel 9.x: https://laravel.com/docs/9.x/passport#creating-a-personal-access-client - Erhan URGUN

14

运行该命令后

php artisan passport:client --personal

并给您此提示

 What should we name the personal access client? [Artisan Personal Access Client]:

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


6
如果你不关心名字,只需使用 php artisan passport:client --personal --no-interaction - Ben Gooding

8

我应该打电话吗?

php artisan passport:install

每次我运行

php artisan:migrate

有没有正确的方法可以做到这件事?

2
我认为在你运行 php artisan migrate:fresh 之后,只需要运行 php artisan passport:install --force 即可。 - The Blind Hawk

6

特征

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

Sanctum和Passport都带有相同的Trait,称为HasApiToken

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

use Laravel\Sanctum\HasApiTokens;

to

use Laravel\Passport\HasApiTokens;

使用PAC进行测试

在实现单元测试时,您可以创建一个测试来创建个人访问客户端(personal-access-client)

如果您在数据库中哈希密码,请在测试用例中将Passport::$hashesClientSecrets设置为false,以便获取未散列的密码。

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);
}

因为我们使用了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();
    }
}

现在,您可以将该类用于其他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);
}

非常感谢您的评论!关于Laravel的适当测试套件,确实很少有相关指南。看起来使用TDD进行Laravel开发的人很少,真是遗憾。另外,您应该在您的Helper文件中添加use Laravel\Passport\Passport;和use Illuminate\Support\Facades\DB;以使其正常工作。 - Riki_tiki_tavi

6

只需运行此命令即可

php artisan passport:install --force

3
我一遍又一遍地遇到同样的错误,但我不知道如何重现它,但我弄清楚了原因。 当您执行php artisan passport:install时,在migrate命令后,它将两个客户端ID存储在数据库中,但如果您再次fresh migrate,显然会丢失那两个先前的ID,这就是为什么在执行安装命令后会显示此错误。 更新 php artisan passport:install -f将强制为新迁移的数据库重新创建ID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接