Laravel Fortify 可以在 API 的上下文中使用吗?据我了解,Fortify(虽然是无头的,即不包括 UI 层)允许我们自定义登录和注册页面,但在成功验证后它会自动重定向到主页页面。尽管 HOME 页面是可定制的,但这不是 API 登录的正常工作方式。它应该简单地以 JSON 格式返回一个成功令牌,而没有任何类型的重定向。
authenticateUsingFortify 中有一个函数,但即便如此,它也只是允许我们自定义身份验证逻辑而不是返回的数据。重定向仍然由 Fortify 执行。
如何在 REST API 的上下文中使用 Fortify?
注意:我将在我的 Vue 前端应用程序中使用它。我还将让Sanctum加入游戏,但在此之前,我只是想看看是否可以使用 Fortify 进行常规的基于令牌的身份验证,而无需编写自己的登录、注册和注销路由以及控制器功能。
我在我的项目中使用 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
我正在使用 laravel sanctum 进行测试,但这里有一些问题.. 我正在创建管理员守卫。
当我将中间件更改为 auth:sanctum_admin .. 它应该只能由管理员访问,但在这里我可以使用普通用户帐户访问 web 守卫。我不知道为什么?...我使用带有多重身份验证包的护照。很好。但这里的密室不能将用户表和管理员分开。
我有一个Laravel网站通过提供代客上backend.test和Nuxt SPA上nuxt.backend.test:3005。当我尝试使用Nuxt Auth模块向Sanctum进行身份验证时,出现以下 CORS 错误:
从源“ http://nuxt.backend.test:3005 ”访问“ http://backend.test/login ”处的 XMLHttpRequest已被 CORS 策略阻止:不存在“Access-Control-Allow-Origin”标头在请求的资源上。
我该如何解决?
Laravel 配置
config/cors.php:
<?php
return [
'paths' => ['*'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => true,
];
Run Code Online (Sandbox Code Playgroud)
routes/api.php:
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Run Code Online (Sandbox Code Playgroud)
app/Http/Kernel.php:
protected $middlewareGroups = [
...
'api' => …Run Code Online (Sandbox Code Playgroud) 所以已经过了几个小时我无法弄清楚这个问题,即使通读并尝试互联网上可用的任何可能的解决方案。我正在将Laravel 7.x与Vue js一起使用,并在Sanctum SPA身份验证方面苦苦挣扎。
使用web.php 中定义的Auth::routes() 的登录请求工作正常
但是,对auth:sanctum 中间件下api.php 中定义的 API 发出的任何请求都会返回 401。例如,调用获取用户对象失败,状态为 401:
这是请求标头:
这是web.php
这是api.php
这是sanctum.php 中的有状态对象
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1,127.0.0.1:8000')),
在 vue.js 方面,我将 withCredentials 标志设置为 true:
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
window.axios.defaults.withCredentials = true;
在cors.php 中, suports_credentials 标志也设置为 true
而且,这是我的Kernel.php
/**
* The application's route middleware groups.
*
* @var …Run Code Online (Sandbox Code Playgroud) 我正在尝试实施 Sanctum SPA 身份验证。尝试登录时出现以下错误(仅在生产中):
production.ERROR: Session store not set on request. {"userId":1,"exception":"[object] (RuntimeException(code: 0): Session store not set on request. at /app/vendor/laravel/framework/src/Illuminate/Http/Request.php:483)
遵循文档中的所有步骤。首先调用GET 请求,然后调用附加会话 cookie 的sanctum/csrf-cookieAPI POST 请求。login感谢您的任何提示!
我的login方法在 中AuthController.php,异常发生在第 28 行。
我的Http\Kernel.php文件包含 API 端点的中间件。
我的 API 端点位于routes/api.php
authentication laravel single-page-application laravel-sanctum laravel-8
我目前正在学习 Laravel(进展不是特别顺利),并且我配置了一些路由来使用 sainttum 测试身份验证。
我正在构建一个仅 API 的 laravel 服务,并计划 ReactJS 项目将使用该 API。
我目前没有使用 ReactJS 并使用 Insomnia REST 客户端来测试 API。
我有一个用于注册新用户、登录的路由,然后另一个路由仅返回经过身份验证的用户以证明身份验证机制正常工作。
我对 CSRF 不太了解,但我的理解是我请求一个新的 CSRF 令牌,然后对于对 API 的每个请求,都会使用此 CSRF 令牌,因此例如当我登录并从相应的路由获取经过身份验证的用户时, CSRF 令牌 cookie 也会被发送,因此如果发送不同的 CSRF 令牌,我应该会收到令牌不匹配错误。
我正在使用 Insomnia 进行测试,方法是向 /sanctum/csrf-cookie 发送请求,该请求返回 204,Insomnia 设置 3 个 cookie,其中一个是 XSRF-TOKEN,据我所知,它是 CSRF 令牌的加密形式。
然后我成功登录,然后当我调用我的路由来获取经过身份验证的用户时,我修改或删除 XSRF-TOKEN cookie 并发送请求,然后我期望收到有关令牌不匹配的错误,但这并没有似乎是这样,我得到了有效的回复。
下面是我的 api.php(我将各种路由分组到单独的 PHP 文件中,以便在实际构建 API 时保持组织有序)
Route::prefix('/auth')->group(__DIR__ . '/endpoints/auth.php');
Route::middleware('auth:sanctum')->get('/me', function(){
//return response(null, 200);
return auth()->user();
});
Run Code Online (Sandbox Code Playgroud)
在我的/endpoints/auth.php我有以下内容:
Route::post('/register', [UserController::class, "register"]);
Route::post('/login', [UserController::class, "login"]);
Route::middleware('auth:sanctum')->post('/logout', [UserController::class, …Run Code Online (Sandbox Code Playgroud) 我在 Laravel 8 中很好地安装了 Laravel JetStream 和 Spatie 的 laravel-permission。
\n我可以在注册过程中为用户分配角色
\n$user->assignRole('visitor');\nreturn $user;\nRun Code Online (Sandbox Code Playgroud)\n并可以通过我在播种器 fil\xc3\xa9s run 方法中分配给角色的权限来限制用户仪表板上的可用菜单项:
\nPermission::create(['name' => 'access profile']);\nPermission::create(['name' => 'access logout']);\n\n$visitor = Role::create(['name' => 'visitor']);\n$visitor->givePermissionTo('access profile');\nRun Code Online (Sandbox Code Playgroud)\n并通过视图中的 can 指令,例如:
\n@can('access profile')\n<!-- Account Management -->\n<div class="block px-4 py-2 text-xs text-gray-400">\n {{ __('Manage Account') }}\n</div>\n\n<x-jet-dropdown-link href="{{ route('profile.show') }}">\n {{ __('Profile') }}\n</x-jet-dropdown-link>\n@endcan\nRun Code Online (Sandbox Code Playgroud)\n因此,我可以根据角色隐藏菜单项,但不幸的是,我仍然可以通过知道确切的 URL 直接访问该功能。
\n我想我必须编写一个中间件来限制对某些功能的访问,但具体怎么做呢?
\n在此堆栈中处理此问题的正确且可接受的方法是什么?
\n谢谢!\nArmand\n所以一切看起来都很好,但是(!)
\n如何禁止直接访问隐藏项目?我想在这种情况下,路由是由 sainttum 控制的,而角色和权限是由 Spatie 的包控制的。
\n是否可以将两者联系起来?
\n谢谢!
\nlaravel laravel-permission laravel-sanctum laravel-jetstream laravel-fortify
我有一个安装了 Next-Auth 的 NextJS 前端和一个使用 Sanctum 的 Laravel 后端当我尝试使用 Next-Auth 的登录功能登录时,它给了我这个错误:
Request failed with status code 419
Run Code Online (Sandbox Code Playgroud)
419 与 CSRF 令牌有关,但我在调用登录方法之前通过调用 sainttum/csrf-cookie 路由来设置令牌
[...nextauth.js]
Request failed with status code 419
Run Code Online (Sandbox Code Playgroud)
apiClient.js
CredentialsProvider
({
name: 'Email and Password',
credentials: {
email: {label: "Email", type: "email", placeholder: "Your Email"},
password: {label: "Password", type: "Password"}
},
async authorize({email, password}, req) {
await apiClient.get("/sanctum/csrf-cookie");
const user = await apiClient.post('/customer/login', {
email: email,
password: password,
});
if (user) {
return user
} else {
return …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 可以,我应该创建一个代表该公司的特定用户吗?或者也许是另一个专门针对公司的模型(和数据库表)?即使我们的情况下只有一个。