Laravel cookie会话生命周期

时间:2014-06-19 22:33:33

标签: session cookies laravel lifetime

我使用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文件中设置,但是你可以看到我需要更长的续航时间来记住我的选项

4 个答案:

答案 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")

对人类来说更有意义