保护 Laravel Sanctum 中其他用户的内部 (SPA) 路由

时间:2021-01-31 21:55:49

标签: laravel laravel-sanctum

我已经配置了 Laravel Sanctum 并且一切都在我的 SPA 上运行,但是如果用户创建了一个令牌,他们可以检查我的网站并调用我的内部 SPA 路由(这不适合他们使用),我现在拥有的是:

Route::middleware('auth:sanctum')->group(callback: function () {
    Route::get('/user', function (Request $request) {
        return new UserResource($request->user());
    });
});

如何阻止除我的 SPA 之外的所有用户访问此路由?

1 个答案:

答案 0 :(得分:0)

经过一些测试,当 Sanctum 对 UI 请求进行身份验证时,它会在 $request 上设置会话,而当用户调用时,没有为他们设置会话。

我创建了一个中间件并将其提供给我的内部路由,代码如下:

class InternalApi
{
    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request
     * @param \Closure $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        if ($request->hasSession()) {
            return $next($request);
        } else {
            return response()->json([], 401);
        }
    }
}

我的 api.php 现在看起来像这样:

Route::middleware('auth:sanctum')->group(callback: function () {
    Route::get('/user', function (Request $request) {
        return new UserResource($request->user());
    })->middleware('internal');
});

更新:documentation中所述,对于 SPA 请求,$request->user()->tokenCan() 无论如何都会返回 true,即使用户没有分配的任何能力。