是否可以使用Curl在Laravel中注销?

rjzwgtxy  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(164)

web.php(在路由目录内)

Route::get('directLogout', function (Request $request) {

        $user = User::where('email', 'pratik@test.com')->first();
        Auth::login($user,true);

        $path = 'http://localhost/multiframework/public/logout';

        try {
            //Set logout to Server
            $client = new Client([
                'base_uri' => 'http://localhost/multiframework/public',
            ]);

            $token = getCSRFToken();

            $response = $client->request('POST', $path, [
                'form_params' => [
                    '_token' => $token,
                ],
//                'form_params' => [
//                    'token' => $token,   // Tried both. Not working token or _token
//                ],
                'exceptions' => true,
                "headers" => ["Accept" => "application/json",'X-CSRF-Token'=> $token],
            ]);

            return $response->getStatusCode();  // 200 for success, 204 for error
        }
        catch (\Exception $e) {
            echo $e->getMessage();
        }

});

function getCSRFToken(){
    return csrf_token();
}

** curl 代码**

$url = "http://localhost/multiframework/public/directLogout";   
$ch = curl_init();
curl_setopt_array($ch, [CURLOPT_URL => $url, CURLOPT_HTTPHEADER => ["Accept" => "application/json"], CURLOPT_RETURNTRANSFER => true]);
$res = curl_exec($ch);
curl_close($ch);
print_r($res);
die;

错误
客户端错误:POST http://localhost/multiframework/public/logout导致419 unknown status响应:{【留言】:“CSRF内标识不匹配。",“异常”:“Symfony\元件\HttpKernel\例外状况\HttpException”,(已截断...)
**注意:**我还尝试绕过VerifyCsrfToken中间件的注销URL。它仍然不起作用。

kknvjkwl

kknvjkwl1#

与其使用curl(因为必须传递用户的会话cookie来验证用户身份,所以比较复杂),不如创建一个API来注销用户:/api/logout/{user_id}

$session = Session::where('user_id', $user_id)->delete();

如果您已经将会话设置为使用数据库,那么注销过程就像从sessions表中删除用户的会话行一样简单。一旦删除了会话(通过user_id列查找),用户将从该网站注销。

s8vozzvw

s8vozzvw2#

我已经找到了解决办法。
我已经在我当前的项目中实现了会话基础登录。
为此,我们需要在当前数据库中创建一个会话表。
https://laravel.com/docs/9.x/session
在config/session.php和.env文件中进行了更改
更改SESSION_DRIVER =数据库
添加以下代码

Route::get('directLogout', function (Request $request) {

        $user = User::where('email', 'pratik@test.com')->first();
        Auth::login($user,true);
        Session::where('user_id', Auth::id())->delete();
        Auth::logout();
        $data = [
            'status' => 200,
            'message' => 'User logged out successfully',
        ];    

        return json_encode($data);
        });

相关问题