我使用Laravel作为OAuth2客户端,我需要保留令牌i cookie。所以,我将驱动程序设置为cookie并保持生命周期120的默认值
当任何用户检查记住我登录时,我试图用代码改变生命周期:
$lifetime = time() + 60 * 60 * 24 * 365;// one year
Config::set('session.lifetime', $lifetime);
但没有成功。在任何其他控制器中,我检查了生命值以及每次获得默认值时。
\Log::info(\Config::get('session.lifetime'));
编辑#1:
够了吗?
if(Input::has('rememberMe')) {
$lifetime = time() + 60 * 60 * 24 * 365; // one year
Session::put('Expires', $lifetime);
}
编辑#2:
我将acess_token键与上面示例中的Expires相同,例如:
public function signin() {
/**
* Code for getting *client_code* and *client_state* from API server
*/
$access_token = $this->provider->getAccessToken('authorization_code', $form_data);
// $access_token is object and contain all data (access_token, refresh_token, expires)
Session::put('access_token', $access_token);
Session::put('refresh_token', $access_token->refreshToken);
Session::put('token_expires', $access_token->expires);
if(Input::has('rememberMe')) {
$lifetime = time() + 60 * 60 * 24 * 365; // one year
Session::put('expires', $lifetime);
}
return Response....
}
这是'默认' Laravel会话(我在/app/config/session.php中将驱动程序从文件更改为 cookie )。我知道生活时间应该在/app/config/session.php文件中设置,但是你可以看到我需要更长的续航时间来记住我的选项
答案 0 :(得分:5)
实际上,当你在Controller
:
$lifetime = time() + 60 * 60 * 24 * 365;// one year
Config::set('session.lifetime', $lifetime);
它不是更新文件中的值,而是仅为当前请求(在内存中)设置它,并且当您使用另一个Controller / Request检查值时,如下所示:
Config::get('session.lifetime');
您从文件系统中获取原始值的值。它在文档中提到如下:
仅在运行时设置的配置值 当前请求,不会转发给后续请求。
答案 1 :(得分:3)
由于在您的情况下使用Cookie作为会话驱动程序似乎没问题,您可以默认将会话生存期设置为/app/config/session.php
中的一年,并存储 cookie的到期日期以及会话中的令牌。这样你就可以人为地控制cookie的有效性。
基本上,您的signin
方法可能如下所示:
public function signin() {
/**
* Code for getting *client_code* and *client_state* from API server
*/
$access_token = $this->provider->getAccessToken('authorization_code', $form_data);
// $access_token is object and contain all data (access_token, refresh_token, expires)
Session::put('access_token', $access_token);
Session::put('refresh_token', $access_token->refreshToken);
Session::put('token_expires', $access_token->expires);
if (Input::has('rememberMe')) {
$expires = time() + 60 * 60 * 24 * 365; // one year
} else {
$expires = time() + 60 * 60 * 2; // two hours
}
Session::put('cookie_expires', $expires);
return Response....
}
然后,只要您想要使用access_token
,就会检查cookie_expires
是否先没有过去(如果是,请在清除会话后将用户重定向到登录页面,例如)。
答案 2 :(得分:1)
我不知道Session::put('expires', $lifetime);
将在何处使用。对我来说,它似乎是一个普通的cookie变量,而不是与任何cookie相关的实际生命周期。
您需要在设置Cookie之前设置Cookie生命周期,并按照Laravel知道您设置新的Cookie生命周期值的方式进行操作。
public function signin() {
$access_token = $this->provider->getAccessToken('authorization_code', $form_data);
if (!$access_token) {
return Response... // Respond some other way if authentication failed.
}
// Check rememberMe first so you can set the right session.lifetime before setting any cookies.
if(Input::has('rememberMe')) {
$lifetime = time() + 60 * 60 * 24 * 365; // one year
Config::set('session.lifetime', $lifetime);
}
Session::put('access_token', $access_token);
Session::put('refresh_token', $access_token->refreshToken);
Session::put('token_expires', $access_token->expires);
return Response....
}
我还有机会在设置Cookie之前添加if (!$access_token) {
,因为您无法成功进行身份验证。
答案 3 :(得分:0)
朋友请使用以下功能代替数字
strtotime("+1 year")
对人类来说更有意义