【问题标题】:Set expiry time for laravel jwt dynamically动态设置 laravel jwt 的过期时间
【发布时间】:2017-04-29 16:37:09
【问题描述】:

您好,我在前端使用 angular js 和 satellizer,在后端使用 laravel 和 tymon jwt 库。我正在使用 jwt 身份验证。我想在我的网络应用程序中记住我的功能。我看到 'ttl' 在 laravel 'config/jwt.php 中设置令牌的到期时间。

 /*
|--------------------------------------------------------------------------
| JWT time to live
|--------------------------------------------------------------------------
|
| Specify the length of time (in minutes) that the token will be valid for.
| Defaults to 1 hour
|
*/

'ttl' => 60,

默认为 1 小时。但是如果用户在登录时点击记住我,我想将其动态更改为 1 周。如何动态更改它。谢谢。

【问题讨论】:

    标签: php angularjs laravel-5 jwt


    【解决方案1】:

    您可以将exp 添加为自定义声明,如下所示:

    $token = JWTAuth::attempt($credentials, ['exp' => Carbon\Carbon::now()->addDays(7)->timestamp]);
    

    上面的代码创建了一个在 7 天后过期的令牌。你不必使用 Carbon 它只需要一个 Unix 时间戳,我在这里使用 Carbon 是为了简单起见,因为它内置在 Laravel 中。

    【讨论】:

    • @user254153 对你有用吗?您介意接受帮助社区的答案吗?谢谢。
    • 很好的解决方案!以及如何在 jwt.php 中设置 ttl?那我可以忽略这个值吗?但是,可以给出我需要的最长时间......我说的对吗?
    【解决方案2】:

    你可以使用JWTFactory(1.0版本)

    $myTTL = 30; //minutes
    
    JWTAuth::factory()->setTTL($myTTL);
    $token = JWTAuth::attempt($credentials);
    

    【讨论】:

      【解决方案3】:

      我不是 100% 确定,但是如果你在 AppServiceProvider@register 配置中设置会发生什么:

      config()->set('jwt.ttl', 60*60*7);
      

      或带有门面:

      Config::set('jwt.ttl', 60*60*7);
      

      为什么要动态设置它?或者你不使用配置中的发布(它没有发布config/jwt.php)?

      编辑:

      另一种解决方案是通过您的.env 文件进行设置:

      config/jwt.php
      // set the default TTL to one week if the .env file does not contain a `JWT_TTL` var
      'ttl' => env('JWT_TTL', 60*60*7), 
      

      .env内:

      JWT_TTL=3600
      

      【讨论】:

      • 为什么要动态设置?我已经提到过这个问题。仅当用户在登录系统时单击记住我时,我才希望令牌在 1 周内过期。如果用户在没有记住我点击的情况下登录,那么默认情况下应该是 1 小时。
      • @user254153 同样的情况!你是怎么解决的?
      【解决方案4】:

      您可以执行以下操作来生成具有所需过期时间的 JWT 令牌:

      JWTAuth::customClaims(['exp' => Carbon\Carbon::now()->addDays(2)->timestamp])
          ->fromUser($user);
      

      【讨论】:

        【解决方案5】:

        泰蒙 JWT v 1.0

        您可以在尝试登录用户时覆盖默认 ttl:

        if (! $token = auth()->setTTL(1)->attempt($credentials)) {
          return response()->json(['message' => 'Unauthorized user'], 401);
        }
        

        【讨论】:

          【解决方案6】:

          我们可以在创建 JWT 令牌时设置令牌到期时间。可以在 token 参数中设置。例如

          $token      = array(
                                   "iss" => "http://example.com",
                                    "aud" => "http://example.com",
                                    "exp" => {YOUR_EXPIRY_TIME}
                                  );
          $jwt=new JWT();
          $JWT_TOKEN=$jwt->encode($token, {YOUR_KEY});
          

          新的token会生成相应的过期时间。

          【讨论】:

          • 在 laravel 端怎么办。
          【解决方案7】:

          对于 JWT 版本 1.0.0-rc.2,在 config/jwt.php 上的文档中有非常清楚的描述

          根据注释: …… 您还可以将此设置为 null,以生成一个永不过期的令牌。 有些人可能想要这种行为,例如一个移动应用程序。 这不是特别推荐的,因此请确保您有适当的 必要时撤销令牌的系统。 注意:如果将此设置为 null,则应从“required_claims”列表中删除“exp”元素

          'ttl' => env('JWT_TTL', 60)  meaning we must set 60 to null
          
           'required_claims' => [
                  'iss',
                  'iat',
                 // 'exp',  <- remove this
                  'nbf',
                  'sub',
                  'jti',
              ],
          

          【讨论】:

            【解决方案8】:

            以上答案都不适合我。我设法让它像这样工作。

            $ttl_in_minutes = 60*24*100;
            // The parameter passed to the auth helper should match what is present in config/auth.php
            if($request->input('remember')) auth('api')->factory()->setTTL($ttl_in_minutes);
            

            【讨论】:

              【解决方案9】:

              您可以使用动态设置令牌过期时间

              JWTAuth::factory()->setTTL($expirationInMinutes);
              
              JWTAuth::attempt($credentials)
              

              以下代码不适用于最新版本

              $token = JWTAuth::attempt($credentials, ['exp' => Carbon\Carbon::now()->addDays(7)->timestamp]);
              

              【讨论】:

                【解决方案10】:

                在 config/jwt.php 中不做任何更改的情况下覆盖令牌 ttl

                $token = auth()->setTTL(7200)->attempt($credentials);

                【讨论】:

                  【解决方案11】:

                  你能做到吗

                  $token = auth('api')->setTTL((AuthController::EXPIRE_IN_DAYS * AuthController::MINUTES_IN_DAY))->attempt($credentials);
                  

                  获取数据负载

                  $data = JWTAuth::decode(new Token( $token))->toArray();
                  
                  {
                    "iss": "",
                    "iat": ,
                    "exp": ,
                    "nbf": ,
                    "jti": "",
                    "sub": ,
                    "prv": ""
                  }
                  
                  response("Success",'LOGIN_SUCCESS',[
                              'access_token' => $token,
                              'token_type' => 'bearer',
                              'expires_in' => $data['exp']
                          ]);
                  

                  【讨论】:

                    【解决方案12】:

                    增加 Laravel auth token 过期时间

                    SESSION_LIFETIME=10080
                    

                    session.php 中的默认值 120 分钟

                    【讨论】:

                      猜你喜欢
                      • 2015-12-13
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-04-18
                      • 2020-08-18
                      • 2016-08-08
                      • 2020-08-17
                      • 2016-09-17
                      • 2016-11-13
                      相关资源
                      最近更新 更多