Sanctum的正确配置可能有点棘手,尤其是在理解它如何与Laravel的默认身份验证系统和Cookie交互时。以下是您问题的答案:
1.
Sanctum
防护和身份验证
圣所
guard
配置在
sanctum.php
确定Sanctum处理请求时将检查哪些警卫进行身份验证。
默认行为
:
'guard' => ['web'],
此配置意味着Sanctum将使用
web
默认情况下会保护身份验证。这个
网状物
guard依赖于Laravel的基于会话的身份验证,这意味着它检查用户是否通过默认的Laravel会话Cookie进行了身份验证。
问题
:
如果通过Laravel默认会话(即通过web界面登录)进行身份验证的用户无法访问受保护的路由
auth:sanctum
,这可能是由于一些潜在的问题:
-
会话Cookie配置
:确保您的会话Cookie配置正确,没有被阻止或丢失。请检查您的Cookie设置是否正确,以及会话是否在请求之间得到维护。
-
Sanctum中间件
:确保
认证:sanctum
中间件已正确应用于您的路由。
可能的误解
:
Sanctum不会自动使用
网状物
卫士对API路由的身份验证。这个
认证:sanctum
中间件专门检查API令牌。对于web路由,Laravel默认的基于会话的身份验证(
网状物
警卫)应该足够了。确保路线受到保护
认证:sanctum
用于API访问,并且使用API令牌,而不是基于会话的cookie。
2.使用承载令牌或会话认证访问路由
要允许通过传递承载令牌或通过会话cookie进行身份验证来访问路由,您需要处理这两种情况:
API路由中间件
:
使用
认证:sanctum
用于应使用Sanctum令牌访问的路由的中间件。
Route::middleware('auth:sanctum')->get('/profile', function (Request $request) {
return $request->user();
});
会话身份验证
:
对于要使用Laravel会话身份验证的web路由,请使用
auth
中间件而不是
认证:sanctum
.
Route::middleware('auth')->get('/profile', function (Request $request) {
return $request->user();
});
处理两者
:
如果需要在单个路由中处理这两种情况,可以创建自定义中间件。然而,这并不常见,可能需要额外的逻辑来检查基于令牌或会话的身份验证。
3.
EnsureFrontendRequestsAreStateful
中间件
目的
:
这个
确保前端请求有意义
中间件用于确保来自前端的请求(通常使用Laravels基于会话的身份验证)是有状态的。此中间件允许Sanctum正确处理使用Cookie进行身份验证(即会话)的请求,这些请求应包含在
api
中间件组。
配置
:
In
api.php
:
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
当您想使用Sanctum进行SPA身份验证时(前端和后端在同一个域上并使用会话Cookie),此中间件是必不可少的。它确保在前端请求期间正确发送和处理Cookie。
何时使用
:
如果您正在使用Sanctum处理API路由(使用令牌)和SPA路由(使用会话Cookie)的身份验证,则应确保您的
应用程序编程接口
中间件组正确处理基于会话的身份验证。
摘要
-
确保
网状物
guard正确用于基于会话的身份验证。
-
使用
认证:sanctum
用于基于API令牌的身份验证和
auth
用于基于会话的身份验证。
-
使用
确保前端请求有意义
用于处理会话SPA身份验证的中间件。
检查您的路由和中间件配置,以确保它们与您预期的身份验证策略一致。