Laravel:使用自定义保护/尝试方法在成功登录时设置cookie

Laravel:使用自定义保护/尝试方法在成功登录时设置cookie,laravel,cookies,laravel-6,Laravel,Cookies,Laravel 6,我正在使用第三方数据库进行身份验证。一切都很好,但现在希望在用户登录时设置cookie 如合同所述: 如果身份验证成功,则尝试方法将返回true。否则,将返回false 这就是我在控制器中所做的: MyLoginController.php $user = Auth::guard('foo')->attempt(['userid' => $request->username, 'password' => $request->password], $request-&

我正在使用第三方数据库进行身份验证。一切都很好,但现在希望在用户登录时设置cookie

如合同所述:

如果身份验证成功,则尝试方法将返回true。否则,将返回false

这就是我在控制器中所做的:

MyLoginController.php

$user = Auth::guard('foo')->attempt(['userid' => $request->username, 'password' => $request->password], $request->remember); 

dd($user);

...

return redirect()->intended(route('home'));
$user = Auth::guard('foo')->attempt(['userid' => $request->username, 'password' => $request->password], $request->remember); 

if ($user) {
    switch (App::environment()) {
        case 'local':
            $cookie = cookie('localCookieName', $user->token, 480);
            break;
        case 'development':
            $cookie = cookie('devCookieName', $user->token, 480);
            break;
        case 'production':
            $cookie = cookie('cookieName', $user->token, 480);
            break;
        default:
            //
            break;
       }

    return redirect()->intended(route('home'))->cookie($cookie);
}

return redirect()->intended(route('home'));
这里的一切都很棒。我得到了预期的
true
false

我想做的是,如果登录成功,在响应上设置一个cookie。我需要用户对象返回以从中获取值。大概是这样的:

MyLoginController.php

$user = Auth::guard('foo')->attempt(['userid' => $request->username, 'password' => $request->password], $request->remember); 

dd($user);

...

return redirect()->intended(route('home'));
$user = Auth::guard('foo')->attempt(['userid' => $request->username, 'password' => $request->password], $request->remember); 

if ($user) {
    switch (App::environment()) {
        case 'local':
            $cookie = cookie('localCookieName', $user->token, 480);
            break;
        case 'development':
            $cookie = cookie('devCookieName', $user->token, 480);
            break;
        case 'production':
            $cookie = cookie('cookieName', $user->token, 480);
            break;
        default:
            //
            break;
       }

    return redirect()->intended(route('home'))->cookie($cookie);
}

return redirect()->intended(route('home'));
我正在使用一个自定义的用户提供者来验证我的用户-那里的一切都很好。我正在获取用户,并在需要时将任何数据保存到本地数据库。我想我可以在UserProvider中设置cookie,但是不做
->cookie($cookie)
任何设置都没有

$user->token
的值正在从我的第三方身份验证返回。这就是为什么我需要能够访问该值

,看起来我需要在响应
->cookie($cookie)
with cookies($cookies)
上设置cookie

这让我相信我需要在我的控制器上设置cookie,但我不确定如何取回用户对象,因为
尝试
方法只返回

如何从
尝试
方法中获取用户对象?也许我让事情变得难以置信的困难,有一个更简单的方法来设置饼干

谢谢你的建议

编辑

这是我的
config/auth.php
文件:

...

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],

    'foo' => [
        'driver' => 'session',
        'provider' => 'foo',
    ],
],


...

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],

    'foo' => [
        'driver' => 'foo',             // Using a 3rd party for auth.
        'model' => App\MyUser::class,  // User model for auth.
    ],

    // 'users' => [
    //     'driver' => 'database',
    //     'table' => 'users',
    // ],
],

尝试
如果用户的凭据有效且正确,则进行登录。因此,您可以从请求或Auth guard获取用户,因为他们已登录:

$user = $request->user();
$user = $request->auth('foo')->user();
$user = Auth::guard('foo')->user();
...
如果您知道
trunt
已通过,用户还可以通过会话保护上的
getlasttrunt
访问:

$user = Auth::guard('foo')->getLastAttempted();
虽然您可以使用,但我不会,因为在信任此值之前,您必须检查
trunt
是否实际返回true。这将保存凭据检索到的最后一个用户,该用户可能未通过身份验证,
trunt
返回false

您不必直接向响应中添加cookie。在文档的Cookie部分中,应包含有关自动将Cookie附加到传出响应的“队列”信息:

Cookie::queue('name', 'value', $minutes);

为什么要进行内部尝试?你还在使用会话保护吗?我已经更新了我的问题以显示我的
config/auth.php
文件。我仍在使用会话保护是的。您要附加的cookie在做什么?@lagbox这有点棘手-第三方身份验证需要(相当于)会话令牌-这是传递回它的cookie的值,以便稍后获取更多信息。不知道,但这正是我必须处理的问题。:)这是有效的——利用“queable”方法是我唯一没有尝试的事情(如图所示)。我还发现使用普通的'olphp
setcookie
是有效的。我试着尽可能多地使用“拉威尔方式”。谢谢你的洞察力!请记住,laravel会加密cookies,所以如果您需要在laravel之外阅读它,这可能是一个问题