如何在前端应用程序中使用 Laravel Sanctum 代币

问题描述 投票:0回答:1

我想我对如何使用 Laravel Sanctum 代币感到困惑。这是我的问题

我有一个应用程序,其中包含 API 和前端。原因是该 API 可供其他外部源使用。但我也希望我的前端使用相同的 API。否则我将重新创建所有控制器来执行与 API 控制器相同的操作

所以用户无法自行注册。管理员将注册它们并为它们分配三个令牌之一 - 每个令牌都有自己的能力

现在,例如,当用户登录并转到“产品”页面时,我想检查他们的令牌是否具有读取产品的能力。有些代币具有这种能力,有些则没有。我的应用程序控制器有以下代码来调用API

public function index()
{
    $products = Http::withToken('my-token')
        ->get('https://my-domain/api/v1/products');
    
    return view('products', ['products' => $products->json()]);
}

但是我应该在

my-token
字符串中放入什么?每个用户的令牌都会不同。我无法获取令牌,因为它已编码在数据库中并且无法检索。

我确信问题出在我的方法上,那么我该如何实现这一目标?

laravel token sanctum
1个回答
0
投票

根据您的设置,为用户分配具有不同能力的令牌,并且您需要使用这些令牌对 API 请求进行身份验证,该解决方案涉及几个关键步骤:

令牌存储和检索:当用户登录到您的应用程序(通过前端)时,您应该根据数据库对用户进行身份验证。身份验证成功后,您应该发出一个 Sanctum 令牌,该令牌存储在用户的会话中或返回到前端(如果您使用的是 Vue.js 或 React 等 JavaScript 框架)。该令牌随后应用于后续 API 请求。

使用中间件进行角色/能力检查:您可以使用 Laravel 的中间件来检查令牌是否具有某些能力。通过 Sanctum 发行代币时,您可以直接指定能力:

$token = $user->createToken('token-name', ['read-products'])->plainTextToken; 然后,在您的 API 路由或控制器中,您可以使用中间件来确保令牌具有所需的功能:

Route::middleware(['auth:sanctum', 'abilities:read-products'])->get('/api/v1/products', function () {
    // Your product retrieval logic here
});

在前端应用程序中传递令牌:在前端中,向 API 发出请求时,您需要在请求标头中包含令牌。执行此操作的确切方法取决于您在前端应用程序中管理状态的方式。如果您使用全局状态管理解决方案(例如用于 Vue 的 Vuex 或用于 React 的 Redux),您可以在登录时将令牌存储在那里,并为每个请求检索它。

对于您在控制器中提到的特定场景,您无法对“my-token”进行硬编码,因为它因用户而异。相反,应该从会话或前端的状态管理中动态检索令牌,具体取决于您在登录时存储令牌的位置。这是一个假设的例子:

public function index(Request $request)
{
    // Assuming the token is sent in the request's Authorization header
    $userToken = $request->bearerToken();

    $products = Http::withToken($userToken)
        ->get('https://my-domain/api/v1/products');
    
    return view('products', ['products' => $products->json()]);
}
© www.soinside.com 2019 - 2024. All rights reserved.