我在我的项目中使用Laravel Sanctum和Angular作为前端。在第二个API请求中得到了未认证的错误。请告诉我我哪里做错了。
前端 -> 127.0.0.1:4200
后端 -> localhost:8888
.env配置
SESSION_DOMAIN=localhost SANCTUM_STATEFUL_DOMAINS=127.0.0.1
在api.php文件的路由组中添加了中间件auth:sanctum。
我在我的项目中使用Laravel Sanctum和Angular作为前端。在第二个API请求中得到了未认证的错误。请告诉我我哪里做错了。
前端 -> 127.0.0.1:4200
后端 -> localhost:8888
.env配置
SESSION_DOMAIN=localhost SANCTUM_STATEFUL_DOMAINS=127.0.0.1
在api.php文件的路由组中添加了中间件auth:sanctum。
针对出现未认证错误的用户,请确保按照以下步骤进行操作:
完成这些步骤后,您将成功通过 auth:sanctum 中间件在 WEB 路由或需要 CRSF 令牌的任何资源路由中进行认证。
[为什么会起作用]
向 /sanctum/csrf-cookie
发送一个空请求可以让 Laravel 向您的浏览器发送新的 cookie 命令,从而设置一个新的 CRSF 令牌,该令牌可以在您的 cookies 中找到。Axios 和大多数库默认将此新令牌作为头部 X-CSRF-TOKEN
的一部分发送,对于常规 Ajax 请求,请在您的头部或表单 _token 中明确包含它们,否则您的 SPA 仍将遭遇419 (令牌过期) 错误。
其他需要注意的事项:
对于原始问题,请确保维护相同的域。我的意思是同时使用 localhost。并设置 SANCTUM_STATEFUL_DOMAIN = localhost:4200
编辑:
还需要设置 SESSION_DRIVER。
SANCTUM_STATEFUL_DOMAINS=localhost:8000,localhost:3000
此外,添加您的会话域
SESSION_DOMAIN=localhost
api.devtest.test
(前端)devtest.test
。在SESSION_DOMAIN
中应该写什么? - Shulz.devtest.test
(注意开头的 .
)-请参考https://laravel.com/docs/10.x/sanctum#cors-and-cookies。 - Dan你检查过你的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,
],
经历了两天的痛苦和绝望,我得出了结论:Bearer标记没有附加到请求中,这是由于我的.htaccess配置引起的。
如果你和我一样无法通过API令牌进行认证,请尝试在Laravel项目的public目录下的.htaccess文件中添加以下行:
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteEngine On
指令之后。根据您分享的截图,我看到您的域名为localhost而不是127.0.01,只需执行以下操作:
SANCTUM_STATEFUL_DOMAINS=localhost
如果您使用Laravel Homestead,请使用您实际的域名。
SANCTUM_STATEFUL_DOMAINS=homestead.test
/etc/hosts
文件下使用虚拟域名“app.test”时,这对我有效。 - OzzyTheGiantE.g.:
SANCTUM_STATEFUL_DOMAINS=*.example.com:443
SESSION_DOMAIN=.example.com
例如:SANCTUM_STATEFUL_DOMAINS=127.0.0.1:4200
虽然在您的情况下,截图显示应该是SANCTUM_STATEFUL_DOMAINS=127.0.0.1:4201
还值得检查config->sanctum.php下的保护设置
就是这样。
/sanctum/csrf-cookie
的请求需要是一个GET
请求。 - Chris J