Laravel cookie 会话生命周期
Posted
技术标签:
【中文标题】Laravel cookie 会话生命周期【英文标题】:Laravel cookie session lifetime 【发布时间】:2014-08-10 14:58:24 【问题描述】:我使用我的 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:
我把 access_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 中将驱动程序从 file 更改为 cookie)。我知道应该在 /app/config/session.php 文件中设置生命周期,但正如您所见,我需要更长的生命周期来记住我选项
【问题讨论】:
你能显示你在cookie中设置令牌的代码吗?您只能在设置时更改 cookie 的过期时间,并且是每个 cookie 的值。 如果您想要“记住我”功能,最好使用 Sentry。 cartalyst.com/manual/sentry 不,这是没有数据库的客户端;) 【参考方案1】:朋友们请用下面的函数代替数字
strtotime("+1 year")
对人类来说更有意义
【讨论】:
【参考方案2】:由于在您的情况下似乎可以使用 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
不是先过去(如果是,在清除会话后将用户重定向到登录页面,例如)。
【讨论】:
【参考方案3】:我不知道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)
,因为您不会总是成功验证。
【讨论】:
感谢您的回复。我昨天尝试了这样的事情,但没有成功:(这不是我们期望的覆盖会话生命周期。 你试过了吗? ***.com/questions/18070400/… 这是另一个想法:Cookie::queue(Cookie::make('access_token', $access_token, $lifetime));
(改编自github.com/illuminate/auth/blob/master/Guard.php)【参考方案4】:
实际上,当您在Controller
中设置这样的值时:
$lifetime = time() + 60 * 60 * 24 * 365;// one year
Config::set('session.lifetime', $lifetime);
它不会更新文件中的值,而是只为当前请求设置它(在内存中),当您使用来自另一个控制器/请求的值检查值时,如下所示:
Config::get('session.lifetime');
您正在从文件系统的原始值中获取值。它在文档中提到如下:
在运行时设置的配置值仅为 当前请求,不会被转移到后续请求中。
【讨论】:
好的。以及如何为“当前”会话/登录用户设置生命周期? 从app/config/session.php
文件中使其持久化。
是的,但是对于所有会话。有些用户想要长时间保留会话/cookie,有些则不想要。这对我来说很困惑。用户从 API 服务器成功登录后,如何为不同的参数制作不同的 cookie?以上是关于Laravel cookie 会话生命周期的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Symfony 中延长会话 cookie 的生命周期?
Android WebView / CookieSyncManager 中会话 cookie 的生命周期