我正在构建一个带有Sanctum认证的Laravel API,并使用Postman进行测试,但我只能得到401 Unauthorized响应。该项目是一个明确的Laravel 10项目与Sanctum。我已经安装了它,迁移了它的表,并执行了默认的DatabaseSeeder。
因为我想让这个API作为不同应用程序中多个前端的后端,所以我想使用Sanctum Tokens(有更好的选择吗?).我已经将token创建路由从this doc
(只是将device_name
属性名改为token_name
,没有涉及更多内容)复制到routes/API.php中:
Route::post('/sanctum/token', function (Request $request) {
$request->validate([
'email' => 'required|email',
'password' => 'required',
'token_name' => 'required',
]);
$user = User::where('email', $request->email)->first();
if (!$user || !Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([
'email' => ['The provided credentials are incorrect.'],
]);
}
return $user->createToken($request->token_name)->plainTextToken;
});
我已经更改了下面的点事件,虽然我不知道它是否需要,因为Laravel文档没有提到它们(在网络搜索中找到这些):
*config/cors.php(默认值false
改为true
):
'supports_credentials' => true,
*Http/Kernel.php(uncommented following line):
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
这是我的 Postman 要求:
我不知道如何克服这个问题。我不想在没有确保API路由正常工作的情况下启动任何前端应用程序。
2条答案
按热度按时间5fjcxozz1#
在Postman请求中,您的目标是web路由
/sanctum/token
,而您在API路由中执行的身份验证路由应为/api/sanctum/token
奇怪的是,你得到了401响应,而你应该得到404响应。
除此之外,我看不出你的实现有任何问题,一旦你在 Postman 请求中使用了正确的报头(
Accept
,Content-Type
),你应该会得到正确的响应,基于你的路由配置,无论是无效的凭据还是纯文本令牌,你都可以将其存储在某个地方,并将其添加到子请求的授权报头上。所以,首先通过用户身份验证发出一个纯文本令牌
一旦成功,保存明文令牌,然后将其用于后续的请求保护,由auth sangtum中间件等。你有这个API路由
那么你的要求
总之,如果您的目标是API路由,请始终在基本URL中追加
/api
yzxexxkh2#
就我个人而言,如果您计划为API使用多个前端客户端,我会使用Passport。
但是,如果你想使用Sanctum,有几件事需要检查:
1.确保您已经更新了app->config->auth.php文件,以更新每个路由所使用的防护。例如,我使用sanctum进行Web身份验证,使用passport进行基于API的身份验证:
'guards' => [ 'web' => [ 'driver' => 'session','provider' => ' users',],'API' => [ 'driver' => 'passport','provider' => ' users',],],
1.确保您的用户模型/控制器在适当的情况下具有sanctum auth参考。例如,我的User模型使用(使用passport,但概念相同):
使用Illuminate\Foundation\Auth\User作为可验证的;使用Laravel\Passport\HasApiTokens;
1.为了在Postman中测试Sanctum,您可能还需要在app->http->kernals文件中注解掉这一行。App\Http\Middleware\VerifyCsrfToken::class但是,您应该确保在使用客户端UI之前启用此中间件,因为它是一个重大的安全漏洞。
这是我遇到的三个主要项目,导致问题,如果没有正确设置。另外,当你做这样的更新时,确保运行php artisan cache:clear和php artisan config:clear,以防遇到缓存问题。