Laravel sanctum 未经身份验证

Posted

技术标签:

【中文标题】Laravel sanctum 未经身份验证【英文标题】:Laravel sanctum unauthenticated 【发布时间】:2020-07-05 15:53:27 【问题描述】:

我在我的项目中使用 Laravel sanctum 以 angular 作为前端。从第二个 api 请求中获取未经身份验证。请让我知道我哪里出错了

前端-> 127.0.0.1:4200

后端-> localhost:8888

.env 配置

SESSION_DOMAIN=本地主机 SANCTUM_STATEFUL_DOMAINS=127.0.0.1

将中间件auth:sanctum添加到api.php中的路由组

参考:https://prnt.sc/rm9ejy

【问题讨论】:

【参考方案1】:

从您分享的屏幕截图中,我看到您的域是 localhost 而不是 127.0.01,请执行以下操作:

SANCTUM_STATEFUL_DOMAINS=localhost

【讨论】:

【参考方案2】:

对于使用 Laravel Homestead 的任何人,请使用您的实际域。

SANCTUM_STATEFUL_DOMAINS=homestead.test

【讨论】:

在我的计算机的/etc/hosts 文件下使用虚拟域“app.test”时,这对我有用【参考方案3】:

您运行的是哪个版本?从 V2.4.0 开始您需要指定端口:

SANCTUM_STATEFUL_DOMAINS=localhost:4200

请参阅此issue 了解更多信息。

【讨论】:

【参考方案4】:

对于遇到未经验证的错误的任何人,请确保您遵循这些步骤。

向 /sanctum/csrf-cookie 发送 GET 请求 向网络路由 /login 发送 post 请求以进行身份​​验证

经过这一步,你将被API路由中的auth:sanctum中间件成功认证。

其他需要注意的事项:

    确保您的 SESSION_DOMAIN 设置为 localhost SANCTUM_STATEFUL_DOMAIN 设置为带有端口的子域/SPA,例如 localhost:8000

对于原始问题,请确保您保持相同的域。我的意思是两者都使用 localhost 。并设置 SANCTUM_STATEFUL_DOMAIN = localhost:4200

已编辑

同时设置 SESSION_DRIVER

【讨论】:

我认为对/sanctum/csrf-cookie 的请求需要是GET 请求。【参考方案5】:

两天的痛苦和绝望得出了这个结论:Bearer 令牌没有附加到请求中,那是因为我的 .htaccess 配置。

如果你和我一样,无法通过 API 令牌进行身份验证,请尝试在 Laravel 项目的公共目录中的 .htaccess 文件中添加这一行:

RewriteRule ^ - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]

就在RewriteEngine On 指令之后。

致谢:Laravel not detecting auth token sent in the header and JWT package

【讨论】:

Sanctum 不使用令牌进行有状态身份验证。它使用 cookie。 痛苦和绝望,我知道你的感受! 谢谢,以上解决方案有效!我自己浪费了很多时间。【参考方案6】:

添加您的域,例如 我的 API 在 localhost:8000 上运行我的客户端在 localhost:3000 上运行所以我的环境设置如下所示

SANCTUM_STATEFUL_DOMAINS=localhost:8000,localhost:3000

另外,添加您的会话域

SESSION_DOMAIN=localhost

【讨论】:

我用自定义域名来调用后端和前端就像(后端)api.devtest.test(前端)devtest.testSESSION_DOMAIN应该写什么?【参考方案7】:

The sanctum stateful domains require the port number as well.

例如SANCTUM_STATEFUL_DOMAINS=127.0.0.1:4200

虽然在你的情况下你的截图显示它应该是SANCTUM_STATEFUL_DOMAINS=127.0.0.1:4201

【讨论】:

【参考方案8】:

我有与 Marco 相同的解决方案,将重写规则添加到我的 htaccess 中公开修复了它。

重写规则 ^ - [E=HTTP_AUTHORIZATION:%HTTP:Authorization]

仅供参考,如果其他人正在这样做,我将其托管在 Auzre Web App Service (linux) 上。

【讨论】:

【参考方案9】:

您检查过您的 Kernel.php 吗? app/Http/Kernel.php

确保您取消注释 \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 因为默认情况下它正在被评论

'api' => [
    \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    'throttle:api',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],

【讨论】:

你成功了!您的建议也包含在文档中,请在此处查看laravel.com/docs/8.x/sanctum#sanctum-middleware

以上是关于Laravel sanctum 未经身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 laravel Sanctum 和 api 令牌身份验证获取用户时出现 401(未经授权)[重复]

Sanctum 和 Postman 的 SPA 身份验证问题

Laravel 5.3 + Passport:总是未经身份验证的错误

如何选择使用 Laravel Sanctum 进行身份验证?

带有 Sanctum 身份验证的 Laravel 8 (Reactjs SPA)

Laravel sanctum 检查用户是不是在没有重定向的情况下通过身份验证