我有一个由 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 令牌不匹配错误。
我阅读了许多详细介绍类似问题的帖子,并实施了他们的建议和配置,包括以下内容:
我有一个看起来像这样的测试:
$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守卫,而第二个请求由于某种原因有web和airlock。
我正在为我的应用程序使用带有 Sanctum 身份验证的 Laravel 7。
如何执行注销程序?
我用:
Auth::user()->tokens()->delete();
Run Code Online (Sandbox Code Playgroud)
它可以工作,但它会删除该用户的所有令牌。我只想删除请求注销的用户的令牌,这样其他会话应该保持打开状态
设置基于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 与 Vue 的默认集成(不是使用 Vue CLI 的单独项目)。我正在尝试对用户进行身份验证,但它始终显示 419 错误。我已将 csrf 令牌包含到 Axios 的标头中,但它仍然提供不匹配错误。
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)
'api' => [
EnsureFrontendRequestsAreStateful::class,
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
]
Run Code Online (Sandbox Code Playgroud)
'paths' => [
'api/*',
'/login',
'/logout',
'/sanctum/csrf-cookie'
],
.
.
.
'supports_credentials' => true,
Run Code Online (Sandbox Code Playgroud)
Route::get('/{any?}', function() {
return view('welcome');
});
Route::post('/login', 'AuthController@login');
Route::post('/logout', 'AuthController@logout');
Run Code Online (Sandbox Code Playgroud)
<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) 项目结构:
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) 我们构建了一个 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 可以,我应该创建一个代表该公司的特定用户吗?或者也许是另一个专门针对公司的模型(和数据库表)?即使我们的情况下只有一个。
我在我的项目中使用 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 中实现这一目标?提前致谢。
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 …
我对 Laravel Sanctum CSRF Cookie 有疑问。我在子域上使用 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)
现在我确实读到了其他一些人也遇到了这个问题。它与你的 Laravel .env 有关,我尝试了SESSION_DOMAIN和SANCTUM_STATEFUL_DOMAINS的所有内容,但老实说,我很无能,因为它一直给我同样的错误。现在,我有这个:
SESSION_DOMAIN=.domain.nl
SANCTUM_STATEFUL_DOMAIN=api.domain.nl
Run Code Online (Sandbox Code Playgroud)
(当然域名替换成我使用的域名)
希望有人能解决这个问题!