Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel自定义登录控制器不';t持续会话_Php_Laravel_Laravel Passport_Laravel 8 - Fatal编程技术网

Php Laravel自定义登录控制器不';t持续会话

Php Laravel自定义登录控制器不';t持续会话,php,laravel,laravel-passport,laravel-8,Php,Laravel,Laravel Passport,Laravel 8,我的系统是使用Vue和Laravel构建的。我的要求是在每次登录时向用户发送一个一次性密码。因此,我创建了一个自定义登录API控制器。我可以创建Passport令牌并将其发送回用户。但是,我也希望Laravel持久化用户会话,但是,这并没有发生。以下是我的代码供参考: Api\LoginController.php 公共功能登录(请求$Request) { $data=$request->all(); 如果(auth()->尝试($data)){ $token=auth()->user() ->

我的系统是使用Vue和Laravel构建的。我的要求是在每次登录时向用户发送一个一次性密码。因此,我创建了一个自定义登录API控制器。我可以创建Passport令牌并将其发送回用户。但是,我也希望Laravel持久化用户会话,但是,这并没有发生。以下是我的代码供参考:

Api\LoginController.php

公共功能登录(请求$Request)
{
$data=$request->all();
如果(auth()->尝试($data)){
$token=auth()->user()
->createToken(配置('app.passport\u token\u key'))->accessToken;
$user=user::whereEmail($data['email'])->first();
//它不是持久性的。当我将用户重定向到下一页时,
//它没有通过身份验证中间件。
auth()->login($user);
如果($this->sendVerificationCode($user)){//发送一次性密码
返回[
“令牌”=>$token,
];
}
}
返回['error'=>true,'message'=>Unauthorized'];
}
web.php(路由文件)

使用App\Http\Controllers\HomeController;
路由::中间件(['auth'])->组(函数(){
路由::get('/home',[HomeController::类,
'索引'])->名称('主');
});
Auth::routes();
api.php(路由文件)

使用App\Http\Controllers\Auth\LoginController;
路由::post('login',[LoginController::class,'login']))
->名称('api:login');
我正在使用Vue JS(Axios)调用登录API


一旦用户登录(通过API),我的最终目标是
web
,并且
API
两个守卫都应该知道用户会话。但是,只有
api
guard可以对我进行身份验证(而不是
web
guard)。

问题是,
StartSession
中间件只存在于web路由中。检查你的
app/Http/Kernel.php
文件,它应该是这样的:

protected$middleware=[
\App\Http\Middleware\TrustProxies::类,
\App\Http\Middleware\CheckFormIntenanceMode::class,
\Illumb\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illumb\Foundation\Http\Middleware\ConvertEmptyStringsToull::class,
];
受保护的$middlewareGroups=[
“网络”=>[
\App\Http\Middleware\EncryptCookies::class,
\Illumb\Cookie\Middleware\AddQueuedCookiesToResponse::class,
//注意这里的StartSession
\Illumb\Session\Middleware\StartSession::class,
\照亮\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illumb\Routing\Middleware\SubstituteBindings::class,
],
“api”=>[
'节气门:60,1',
\Illumb\Routing\Middleware\SubstituteBindings::class,
],
];
如果要使用会话,应将中间件添加到登录路由中。 在
app/Http/Kernel.php中的
routeMiddleware
数组中添加:

'session.start'=>\illumb\session\Middleware\StartSession::class
然后将中间件添加到
routes/api.php
文件中的logi路由:

Route::post('login', [\App\Http\Controllers\Api\LoginController::class, 'login'])
   ->name('api:login')
   ->middleware('session.start');

只是不要使用JS来执行API调用,而是使用PHP。。。此外,您的
api.php
没有中间件。我建议为此任务定义一个自定义中间件,并将其分配给这两个任务。@MartinZeitler调用API是我的VueJS代码正在做的事情之一。我也尝试过中间件的想法,但是,由于我的主要问题“保存/持久化用户会话”,我无法实现它。感谢创建了这个问题,然后忽略可能没有什么帮助。在我看来,API身份验证和web身份验证不会混合在一起,这只不过是逻辑而已。。。但我认为,如果将web中间件添加到api路由中,它将work@SarjitDelivala同时使用web和API的原因是什么?感谢您的回复。然而,这是行不通的。我尝试登录表单,然后导航到主页,但web中的/Home路由中的“auth”中间件出现故障。php您可能还需要添加
EncryptCookies
中间件,因为auth令牌存储在加密Cookie上。它仍然不起作用(