【问题标题】:Laravel 8, Sanctum and Angular 8Laravel 8、Sanctum 和 Angular 8
【发布时间】:2021-02-18 06:01:09
【问题描述】:

我有linux的主题环境。我已经使用 EnsureFrontendRequestsAreStateful、.env 进行了 cors.conf、session.conf、kernel:api 的配置。我阅读的所有文档中都包含所有这些内容。 Laravel 在 localhost:8000 本地主机中的角度:4200

特别是:

内核.php:

'api' => [
      \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
      'throttle:api',
...

cors.php

'paths' => [
    'api/*',
    'login',
    'logout',
    'sanctum/csrf-cookie'
],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => true,

圣所.php

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost:4200,localhost,localhost:8000,127.0.0.1,127.0.0.1:4200,127.0.0.1:8000')),

在.env中

SESSION_DOMAIN=.localhost

在 Angular 中,当我得到 csrf-cookie 响应时:

Bloccata Richiesta multiorigin (cross-origin): il criterio di corrispondenza dell'origine non consente la lettura della risorsa remota da http://localhost:8000/sanctum/csrf-cookie。动机:richiesta CORS non riuscita。

这是我的堆栈:

我哪里错了? 谢谢了。

【问题讨论】:

  • csrf-collie 请求加载正常,允许来源正确,登录返回什么?如果您无法检查其请求的详细信息,请在邮递员中查询并分享响应
  • 是的,我知道,但只是返回的 cookie 没有保存在存储中,所以在登录请求中错过了 X-CSRF-COOKIE
  • 你正在使用 withCredentials 所以技术上应该发送 cookie,至于在 API 中使用 cookie,我建议转移到 JWT 并使用 Laravel 的 api 路由。向web路由发送请求是针对网页的。

标签: angular laravel api cors laravel-sanctum


【解决方案1】:

由于违反跨域资源共享或简称 CORS,您的请求被阻止。

当您从域 A 向域 B 发出请求时会出现此问题。在这种情况下,当您使用 localhost 时,我想您是从 ng 服务器 @localhost:4200localhost:8000 发出请求,即 Laravel 服务器。

要解决这个问题,您需要在 Laravel 服务器的响应中添加 CORS 标头,即 localhost:8000。在简单的情况下,您可以在回复中添加此标头Access-Control-Allow-Origin: *

* 表示服务器愿意响应来自任何域的请求。这是生产中的一个严重安全问题,因此您应该始终指定应该允许 CORS 使用的确切域,例如:

Access-Control-Allow-Origin: http://localhost:4200

有多种方法可以做到这一点。出于开发目的,您可以使用 CORS 插件,例如用于 FireFox 的 CORS everywhere

对于开发服务器,您还可以在 Web 服务器中或通过 Laravel 添加 CORS 标头。从here 使用laravel-cors 包的简单方法

您还可以在Mozilla Site 上进一步阅读 CORS

【讨论】:

  • 谢谢,但是没有足够的设置 laravel cors 配置文件?在许多教程中这项工作。我已经配置了firefox插件Moesif CORS,但是不行。
  • Laravel CORS 配置就足够了,但是您还需要验证您的标头是否正确并正确发送到服务器。可以分享请求和响应标头吗?
  • 我请求:GET /sanctum/csrf-cookie undefined 主机:localhost:8000 用户代理:Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0 接受: application/json, text/plain, / Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate来源:localhost:4200 连接:keep-aliveReferer:localhost:4200/corporate/session/login 响应被阻塞。
  • 这在 Chrome 中:`请求 URL:localhost:8000/sanctum/csrf-cookie 请求方法:GET 状态代码:204 无内容远程地址:127.0.0.1:8000 推荐人策略:no-referrer-when-downgrade Access-Control -Allow-Credentials:true Access-Control-Allow-Origin:localhoat:4200 Cache-Control:无缓存,私有连接:关闭日期:2020 年 11 月 5 日星期四 15:02:21 GMT 日期:2020 年 11 月 5 日星期四 15 :02:21 GMT 主机: localhost:8000 phpdebugbar-id: Xf3c98679b8e84bb0000e3754630791c8 Set-Cookie: XSRF-TOKEN=eyJpdiI6InNFSGxrZjhZUklCaTJ2dStvVFo5d2c9PSIsInZhbHVlIjoibHBCbTk4S...
  • Set-Cookie: laravel_session=eyJpdiI6I.....zov-2020 17:02:21 GMT; Max-Age=7200; path=/; domain=.localhost; httponly; samesite=lax X-Powered-By: PHP/7.4.12 Accept: application/json, text/plain, */* Accept-Encoding: gzip, deflate, br Accept-Language: it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7 Connection: keep-alive Host: localhost:8000 Origin: http://localhost:4200 Referer: http://localhost:4200/corporate/session/login Sec-Fetch-Mode: cors Sec-Fetch-Site: same-site User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 2021-03-28
  • 2023-03-18
  • 2021-09-09
  • 2021-07-17
  • 2021-05-31
  • 2020-06-17
  • 2021-05-08
相关资源
最近更新 更多