postman Laravel 10令牌验证与Sanctum返回“401 Unauthorized”

qacovj5a  于 2023-10-18  发布在  Postman
关注(0)|答案(2)|浏览(315)

我正在构建一个带有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路由正常工作的情况下启动任何前端应用程序。

5fjcxozz

5fjcxozz1#

在Postman请求中,您的目标是web路由/sanctum/token,而您在API路由中执行的身份验证路由应为/api/sanctum/token
奇怪的是,你得到了401响应,而你应该得到404响应。
除此之外,我看不出你的实现有任何问题,一旦你在 Postman 请求中使用了正确的报头(AcceptContent-Type),你应该会得到正确的响应,基于你的路由配置,无论是无效的凭据还是纯文本令牌,你都可以将其存储在某个地方,并将其添加到子请求的授权报头上。
所以,首先通过用户身份验证发出一个纯文本令牌

POST https://mydomain.me/api/sanctum/token HTTP/1.1
Accept: application/json
Content-Type: application/json

{
    "email": "[email protected]",
    "password": "something-password",
    "token_name": "test"
}

一旦成功,保存明文令牌,然后将其用于后续的请求保护,由auth sangtum中间件等。你有这个API路由

Route::group(['middleware' => 'auth:sanctum'], function () {
    Route::get('/whatever-routes-protected-by-auth-sanctum', [MyDuhController::class, 'duh'])->name('duh');
});

那么你的要求

GET https://mydomain.me/api/whatever-routes-protected-by-auth-sanctum HTTP/1.1
Accept: application/json
Content-Type: application/json
Authorization: Bearer PLAIN_TEXT_TOKEN

{
    "hey": "Yes",
    "hi": "hello"
}

总之,如果您的目标是API路由,请始终在基本URL中追加/api

yzxexxkh

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,以防遇到缓存问题。

相关问题