我在 Laravel Passport 版本 10.48.22 和 Laravel Passport 版本 12.3.0 中使用时遇到错误。
重现步骤:
我按照 Laravel 文档将预定义的应用程序路由移至单独的文件
api.php
。
我将
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 路线。
我昨天就明白了这一点。对于 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 的实现,可以让用户登录到客户端,所以我可能很快就会写一篇博客文章来涵盖所有内容。