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.test
SESSION_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 进行身份验证?