标签: laravel-sanctum

未使用 Laravel Sanctum 和 Angular 为跨域请求设置 CSRF Coo​​kie

概述

我有一个由 Laravel 驱动的 api,本地托管在http://tenant.api.hydrogen.local上,还有一个 Angular 9.2 SPA,在http://localhost:8100上提供服务。我最近安装了 Laravel Sanctum 进行身份验证,并按照文档中列出的 SPA 说明进行操作,但 CSRF 令牌未附加到来自 SPA 的请求,因此我收到 CSRF 令牌不匹配错误。

//abc.api.hydrogen.local/sanctum/csrf按照指示,我在随后尝试登录之前进行初始调用:

this.http.get('sanctum/csrf-cookie')
    .pipe(
        switchMap(result => this.http.post('auth/login', {'email': email, 'password': password}))
    );
Run Code Online (Sandbox Code Playgroud)

注意:我有一个拦截器,它在请求 url 前面加上 api url '//abc.api.hydrogen.local/',例如 'sanctum/csrf-cookie' 将变为 '//abc.api.hydrogen.local/sanctum/ csrf-cookie'

来自 sainttum/csrf-cookie 的响应与预期的标头一起返回:

Access-Control-Allow-Credentials: true
Set-Cookie: XSRF-TOKEN=eyJpdiI6Ilc3UkRLR1BSZ29TWVh3ZWZEQ3Y4aGc9PSIsInZhbHVlIjoiRUZBZXNFWTlZbWo5QWhIeWsrRmpjNUZVWkExSGtaT1hzUTVnSXpoaGQ4c3dFc2VLNjZsUHlUVWFmbG1uVVdKZSIsIm1hYyI6ImU1ZTAxNGFmMjAwNWRiMDhiODFjMGZhYTljYmU1NmRjYTUzYTNmNDJjNWM3YmQyM2FkY2I2OGYwNjYzNGU2MjkifQ%3D%3D; expires=Thu, 30-Apr-2020 13:35:06 GMT; Max-Age=7200; path=/; domain=localhost
Access-Control-Allow-Origin: http://localhost:8100
Run Code Online (Sandbox Code Playgroud)

但是,当我查看浏览器控制台时,我没有看到存储 > cookie 中设置任何内容。此外,后续调用“login/”时没有附加 cookie,并且我收到 CSRF 令牌不匹配错误。

我阅读了许多详细介绍类似问题的帖子,并实施了他们的建议和配置,包括以下内容:

Laravel API

  • 在 .env 中,我设置了 SESSION_DRIVER=cookie 和 SESSION_DOMAIN=localhost:8100
  • 在 config/sanctum …

laravel angular laravel-sanctum

6
推荐指数
1
解决办法
1万
查看次数

测试抛出 RequestGuard::viaRemember() 在第二个请求上不存在

我有一个看起来像这样的测试:

$user = factory(User::class)->state('verified')->create();

$this->be($user);
$file = new UploadedFile(storage_path('testing/user.jpg'), 'user.jpg', 'image/jpeg');

$this->post('/account/missing-fields/upload', [
    'file' => $file
], ['Content-Type' => 'multipart/form-data'])->dump();
$this->post('/account/missing-fields/upload', [
    'file' => $file
], ['Content-Type' => 'multipart/form-data'])->dump();
Run Code Online (Sandbox Code Playgroud)
{#2983
  +"token": "hHAY7vD8fOiW8mVU9OIlxVSJv5FzAq52e0coaFHKRC"
  +"extension": "jpg"
  +"mime": "image/jpeg"
}
{#3072
  +"message": "Method Illuminate\Auth\RequestGuard::viaRemember does not exist."
  +"exception": "BadMethodCallException"
  +"file": "/app/backend/vendor/laravel/framework/src/Illuminate/Support/Traits/Macroable.php"
   ...
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,第一次请求成功,并返回一个令牌,当我第二次请求时,Laravel 突然说viaRemember方法不存在。

我不知道为什么它不应该工作。

应该注意的是,我可以更改发布请求,第二个请求总是会像上面那样失败。

通过框架,错误发生在Illuminate\Session\Middleware\AuthenticateSession,其中第一个请求有一个web守卫,而第二个请求由于某种原因有webairlock

在此输入图像描述

php laravel laravel-airlock laravel-sanctum

6
推荐指数
0
解决办法
837
查看次数

Laravel 7 Sanctum 注销

我正在为我的应用程序使用带有 Sanctum 身份验证的 Laravel 7。
如何执行注销程序?
我用:

Auth::user()->tokens()->delete();
Run Code Online (Sandbox Code Playgroud)

它可以工作,但它会删除该用户的所有令牌。我只想删除请求注销的用户的令牌,这样其他会话应该保持打开状态

laravel laravel-sanctum

6
推荐指数
3
解决办法
1万
查看次数

Laravel Santum 上 SSR 模式 Nuxt 的身份验证问题

设置基于Laranuxt - Laravel 7 和 Nuxt 的组合。在 Windows 上运行 PHP 7.4.8

我一直在尝试使用 Sanctum 身份验证器模块通过 Laravel 7 在 nuxt 应用程序上对用户进行身份验证。我现在得到的答复是,这似乎可以吗?

Request URL: http://localhost:8000/login
Request Method: POST
Status Code: 204 No Content
Run Code Online (Sandbox Code Playgroud)

接下来我尝试获取用户数据,但是我不能,因为我没有授权;

Request URL: http://localhost:8000/api/user
Request Method: GET
Status Code: 401 Unauthorized
Run Code Online (Sandbox Code Playgroud)

但是,如果我在 Nuxt 中登录后转到 laravel 前端,我已经登录了:

Request URL: http://localhost:8000/home
Request Method: GET
Status Code: 200 OK
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

尝试打开http://localhost:8000/api/user让我陷入一个持续的循环,api/用户和登录之间的重定向以结尾ERR_TOO_MANY_REDIRECTS

nuxt.config.js:

export default {
  /*
  ** Nuxt rendering mode
  ** See https://nuxtjs.org/api/configuration-mode
  */
  mode: 'universal',

    server: {
            port: process.env.PORT, …
Run Code Online (Sandbox Code Playgroud)

laravel nuxt.js laravel-7 laravel-sanctum

6
推荐指数
0
解决办法
2858
查看次数

Laravel 7 Vue 2 Sanctum 登录错误 419;CSRF 令牌不匹配

我使用 Laravel 与 Vue 的默认集成(不是使用 Vue CLI 的单独项目)。我正在尝试对用户进行身份验证,但它始终显示 419 错误。我已将 csrf 令牌包含到 Axios 的标头中,但它仍然提供不匹配错误。

引导程序.js

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
window.axios.defaults.withCredentials = true;
window.axios.defaults.baseURL = "http://localhost:8000/";
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = $('meta[name="csrf-token"]').attr('content');
Run Code Online (Sandbox Code Playgroud)

内核.php

'api' => [
    EnsureFrontendRequestsAreStateful::class,
    'throttle:60,1',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
]
Run Code Online (Sandbox Code Playgroud)

cors.php

'paths' => [
    'api/*',
    '/login',
    '/logout',
    '/sanctum/csrf-cookie'
],
.
.
.
'supports_credentials' => true,
Run Code Online (Sandbox Code Playgroud)

网页.php

Route::get('/{any?}', function() {
    return view('welcome');
});

Route::post('/login', 'AuthController@login');
Route::post('/logout', 'AuthController@logout');
Run Code Online (Sandbox Code Playgroud)

登录Modal.vue

<template>
    <form @submit.prevent="submit" method="POST">
        <input type="text" class="form-control" placeholder="Email" v-model="email" />
        <input
            type="password"
            class="form-control"
            placeholder="Password"
            v-model="password" …
Run Code Online (Sandbox Code Playgroud)

csrf laravel single-page-application vue.js laravel-sanctum

6
推荐指数
1
解决办法
8499
查看次数

Nuxt 项目在尝试通过 Laravel Sanctum 登录用户时抛出 CSRF 令牌不匹配 419 错误

项目结构:

2个文件夹,即apiand client,其中 api 用于 laravel 安装,client 指的是 nuxt 项目。

Laravel (v-8.00) 设置:

这是我在.env文件中的会话变量

SESSION_DRIVER=cookie
SESSION_LIFETIME=120
SESSION_DOMAIN=127.0.0.1
SANCTUM_STATEFUL_DOMAINS=127.0.0.1:3000
Run Code Online (Sandbox Code Playgroud)

cors.php 包含以下内容

'paths' => [
    'api/*',
    'login',
    'logout',
    'sanctum/csrf-cookie'
],

'allowed_methods' => ['*'],

'allowed_origins' => ['*'],

'allowed_origins_patterns' => [],

'allowed_headers' => ['*'],

'exposed_headers' => false,

'max_age' => true,

'supports_credentials' => true,
Run Code Online (Sandbox Code Playgroud)

没有sanctum.php对它进行任何更改,它包含

'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1,127.0.0.1:8000,::1')),
Run Code Online (Sandbox Code Playgroud)

Nuxt 设置

.env 文件包含:

PORT=3000
HOST=127.0.0.1
BASE_URL=http://127.0.0.1:3000
API_URL=http://127.0.0.1:8000
Run Code Online (Sandbox Code Playgroud)

nuxt.config.js 包含:

modules: [
    '@nuxtjs/axios',
    '@nuxtjs/auth-next',
    '@nuxtjs/pwa',
    '@nuxtjs/dotenv',
],
/* …
Run Code Online (Sandbox Code Playgroud)

laravel vue.js nuxt.js laravel-sanctum

6
推荐指数
1
解决办法
1961
查看次数

Laravel Sanctum 是否适合向第三方服务器提供 API 访问权限?

我们构建了一个 API(目前仅包含一条路由),以便向与我们合作的另一家公司提供特定数据的访问权限。

其他公司对我们的端点执行的 API 调用是在服务器端进行的。
该 API 是使用Laravel 8.

为了提供问题的更多背景信息,我们的系统收集我们的 GPS 设备发送的坐标,并且我们希望向其他公司提供对一组特定 GPS 设备的坐标的访问权限。
坐标存储在我们的数据库中,API 路由只是执行 SELECT 查询,仅允许访问这些特定设备的数据。

在互联网上搜索,我发现这Laravel Sanctum可以帮助提供API tokensAPI 的使用。我的问题是,我们可以用于Laravel Sanctum当前的工作流程吗?合适吗?

文档中的示例表明我们可以执行以下操作:

$user->createToken('token-name', ['server:update'])->plainTextToken;
Run Code Online (Sandbox Code Playgroud)

user但是,就我而言,其他公司没有。如果 Laravel Sanctum 可以,我应该创建一个代表该公司的特定用户吗?或者也许是另一个专门针对公司的模型(和数据库表)?即使我们的情况下只有一个。

php authentication laravel laravel-sanctum

6
推荐指数
1
解决办法
679
查看次数

自定义 Laravel Santum 未授权响应

我在我的项目中使用 laravel sainttum,但我遇到了一个问题。我想自定义 401 响应代码(未经授权)以在令牌无效时返回 JSON,如下所示:

    {
    "data": {
        "code": 401,
        "book": null,
        "success": false,
        "error": {
            "message": "Not authenticated"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是默认响应:

{
    "message": "Unauthenticated."
}
Run Code Online (Sandbox Code Playgroud)

如何在 Laravel Santum 中实现这一目标?提前致谢。

rest laravel laravel-sanctum laravel-8

6
推荐指数
1
解决办法
9968
查看次数

Laravel Sanctum token expiration based on last usage

I have set the sanctum token expiration in the config file, for let's say 24 hours:

/*
|--------------------------------------------------------------------------
| Expiration Minutes
|--------------------------------------------------------------------------
|
| This value controls the number of minutes until an issued token will be
| considered expired. If this value is null, personal access tokens do
| not expire. This won't tweak the lifetime of first-party sessions.
|
*/

'expiration' => 24 * 60,
Run Code Online (Sandbox Code Playgroud)

Doing that, my token gets invalid after this period of time. What I …

php access-token laravel laravel-sanctum

6
推荐指数
1
解决办法
3876
查看次数

Laravel sainttum csrf cookie set 问题“尝试通过 Set-Cookie 标头设置 cookie 被阻止,因为它的 Domain 属性......”

我对 Laravel Sanctum CSRF Coo​​kie 有疑问。我在子域上使用 Laravel 8 运行 API: api.domain.nl 并在 domain.nl 上使用 NuxtJS 运行前端 现在我想使用设置的 CSRF cookie 保护将发送到 api.domain.nl 的 POST 请求在前端。为了实现这一目标,我阅读了有关 Laravel Sanctum 的文章。现在我向 api.domain.nl/api/sanctum/csrf-cookie 发送 POST 请求,这会返回 204 状态并尝试执行 SET-COOKIE 标头。在本地主机上,这工作正常。但每当我尝试在我的服务器上执行此操作时,我都会收到此错误:

This attempt to set a cookie via a Set-Cookie header was blocked because its Domain attribute was invalid with regards to the current host URL
Run Code Online (Sandbox Code Playgroud)

通过 Set-Cookie 标头设置 cookie 的尝试被阻止,因为其 Domain 属性对于当前主机 URL 无效

现在我确实读到了其他一些人也遇到了这个问题。它与你的 Laravel .env 有关,我尝试了SESSION_DOMAINSANCTUM_STATEFUL_DOMAINS的所有内容,但老实说,我很无能,因为它一直给我同样的错误。现在,我有这个:

SESSION_DOMAIN=.domain.nl
SANCTUM_STATEFUL_DOMAIN=api.domain.nl
Run Code Online (Sandbox Code Playgroud)

(当然域名替换成我使用的域名)

希望有人能解决这个问题!

laravel nuxt.js laravel-sanctum laravel-8

5
推荐指数
1
解决办法
1344
查看次数