【问题标题】:Laravel cookie session lifetimeLaravel cookie 会话生命周期
【发布时间】: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
  • 不,这是没有数据库的客户端;)

标签: session cookies laravel lifetime


【解决方案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) {,因为您不会总是成功验证。

      【讨论】:

      【解决方案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?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2017-09-04
      • 1970-01-01
      • 2018-08-29
      • 2016-03-23
      • 1970-01-01
      相关资源
      最近更新 更多