Laravel Passport:类型错误:参数#2($guard)必须是 Illuminate\Contracts\Auth\StatefulGuard 类型

问题描述 投票:0回答:1

我在 Laravel Passport 版本 10.48.22 和 Laravel Passport 版本 12.3.0 中使用时遇到错误。

重现步骤:

  1. 我按照 Laravel 文档将预定义的应用程序路由移至单独的文件

    api.php

  2. 我将

    guard
    文件中的
    config/passport.php
    设置为
    'api'

错误信息:

TypeError: Laravel\Passport\Http\Controllers\AuthorizationController::__construct(): Argument #2 ($guard) must be of type Illuminate\Contracts\Auth\StatefulGuard, Laravel\Passport\Guards\TokenGuard given in file C:\PHP\rest-api-backend\vendor\laravel\passport\src\Http\Controllers\AuthorizationController.php on line 52   
  • 我验证了

    api
    防护在
    config/auth.php
    中的定义正确。

  • 我查看了 Laravel Passport 文档,了解

    api
    防护所需的任何其他配置。

  • 我在 Stack Overflow 上搜索了类似的问题,但找不到解决方案。

可能原因:

  • AuthorizationController
    预期的防护类型与提供的
    TokenGuard
    之间可能不匹配。

  • 可能存在配置问题,需要执行额外步骤才能使用 Laravel Passport 启用

    api
    防护。

我需要什么帮助:

  • 了解为什么

    AuthorizationController
    需要
    StatefulGuard
    而不是提供的
    TokenGuard

  • 找到解决类型不匹配问题的方法,并使

    api
    守卫与 Laravel Passport 一起工作。

附加信息:

  • 相关代码片段:

    • config/passport.php
      (防护配置)

    • config/auth.php
      (API守卫定义)

    • api.php
      (相关路线定义)

  • 我已经在

    api.php
    中注释掉了预定义的 Laravel Passport 路线。

php laravel rest laravel-passport
1个回答
0
投票

我昨天就明白了这一点。对于 PKCE 实施,您需要在护照配置中将

web
设置为守卫。

目标是在服务器的视图上进行登录和注册。然后,它将提示用户授权访问您的客户端应用程序(它通过您在创建客户端时选择的名称来执行此操作)。

如果您想到其他 OAuth 流程,您通常会被带到另一个 URL 进行登录并重定向到应用程序。这就是 PCKE 的实现。

这是我为登录/注册所做的事情。

注意:我在 Laravel 实例上安装了 Inertia,因为我已经有一段时间没有使用 Blade 并且不想再回来了。我还想与我的 Next 应用程序保持一致。

public function login(): Response
{
    return Inertia::render('Auth/Login');
}

public function authenticate(WebLoginRequest $request)
{
    if (!auth()->attempt($request->only('email', 'password'), $request->remember)) {
        throw ValidationException::withMessages([
            'email' => trans('auth.failed'),
        ]);
    }

    return redirect()->intended();
}


    public function register(): Response
{
    return Inertia::render('Auth/Register');
}

public function store(WebRegisterRequest $request)
{
    User::create([
        'name' => $request->name,
        'email' => $request->email,
        'password' => Hash::make($request->password),
    ]);

    return redirect('login');
}

我还有一个 PKCE 的实现,可以让用户登录到客户端,所以我可能很快就会写一篇博客文章来涵盖所有内容。

© www.soinside.com 2019 - 2024. All rights reserved.