代码之家  ›  专栏  ›  技术社区  ›  gamedev

laravel sanctum与默认的auth:web`

  •  0
  • gamedev  · 技术社区  · 1 年前

    仅仅因为我对sanctum方案的理解在某些地方似乎是错误的:

    1.)我想通过阅读sanctum的配置,它将使用默认值

    /*
    |--------------------------------------------------------------------------
    | Sanctum Guards
    |--------------------------------------------------------------------------
    |
    | This array contains the authentication guards that will be checked when
    | Sanctum is trying to authenticate a request. If none of these guards
    | are able to authenticate the request, Sanctum will use the bearer
    | token that's present on an incoming request for authentication.
    |
    */
    
    'guard' => ['web'],
    

    web guard,这意味着已经登录网站的用户(使用默认的laravel身份验证)将能够查看路由,并受到以下保护 auth:sanctum ? 在我的测试中,用户仍然没有经过身份验证,也无法访问路由,即使他们经过了laravel的身份验证,是否存在某种误解?

    2.)如何实现能够访问路线,无论是通过通过 bearerToken 或者只是通过laravel进行身份验证(使用默认会话cookie)? 要么使用 Route::middleware(['auth:sanctum']) 没能成功。 我总是在浏览器中被重定向到:

    public const HOME = '/user/dashboard';
    

    路线。

    使用a bearertoken 内部邮递员工作正常。

    3.)什么是 EnsureFrontendRequestsAreStateful 中间件用于?

        'api' => [
            \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   Arash    1 年前

    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身份验证的中间件。

    检查您的路由和中间件配置,以确保它们与您预期的身份验证策略一致。

    推荐文章