保护 Laravel Sanctum 中其他用户的内部 (SPA) 路由
Protect internal (SPA) routes from other users in 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 之外的所有用户访问此路由?
经过一些测试,当 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()
将 return无论如何都是真的,即使用户没有分配任何能力。
我已经配置了 Laravel Sanctum 并且一切都在我的 SPA 上工作,但是如果用户创建了一个令牌,他们可以检查我的网站并调用我的内部 SPA 路由(这不适合他们使用), 我现在拥有的是:
Route::middleware('auth:sanctum')->group(callback: function () {
Route::get('/user', function (Request $request) {
return new UserResource($request->user());
});
});
如何阻止除我的 SPA 之外的所有用户访问此路由?
经过一些测试,当 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()
将 return无论如何都是真的,即使用户没有分配任何能力。