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 的生命周期

如何同步表单身份验证 cookie 和 Asp.Net 会话的生命周期?

Laravel 5 - 用户在会话生命周期后不注销

浅谈Cookie的生命周期问题

cookie超过生命周期后会失效,问题是失效是指cookie文件被删还是浏览器不再使用该cookie但文件仍在