Laravel 密室未经身份验证

use*_*941 7 laravel-7 laravel-sanctum

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

前端-> 127.0.0.1:4200

后端-> 本地主机:8888

.env 配置

SESSION_DOMAIN=本地主机SANCTUM_STATEFUL_DOMAINS=127.0.0.1

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

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

Had*_*azi 20

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

SANCTUM_STATEFUL_DOMAINS=localhost:8000,localhost:3000
Run Code Online (Sandbox Code Playgroud)

另外,添加您的会话域

SESSION_DOMAIN=localhost
Run Code Online (Sandbox Code Playgroud)


jrr*_*n90 13

你检查过你的 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,
],
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*aro 8

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

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

RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
Run Code Online (Sandbox Code Playgroud)

就在RewriteEngine On指令之后。

鸣谢:Laravel 未检测到标头和 JWT 包中发送的身份验证令牌

  • Sanctum 不使用令牌进行状态身份验证。它使用cookie。 (2认同)
  • 痛苦和绝望,我知道你的感受! (2认同)

Sta*_*loh 7

对于任何遇到未经身份验证错误的人,请确保您按照以下步骤操作。

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

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

其他需要注意的事项:

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

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

已编辑

同时设置 SESSION_DRIVER

  • 我认为对“/sanctum/csrf-cookie”的请求需要是“GET”请求。 (4认同)

Lui*_*oya 5

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

SANCTUM_STATEFUL_DOMAINS=localhost
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 5

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

SANCTUM_STATEFUL_DOMAINS=homestead.test
Run Code Online (Sandbox Code Playgroud)