【问题标题】:Get a new csrf token, even if the current token has expired获取新的 csrf 令牌,即使当前令牌已过期
【发布时间】:2018-01-26 01:27:44
【问题描述】:

Laravel 有没有办法获得一个新的 CSRF 令牌,即使当前令牌可能已经过期?我希望能够在不更新用户界面的情况下获得新令牌。

我一直在尝试使用 Visibility API 来检查浏览器(仅限移动用户)是否再次激活,但我很快发现这并不是真正的问题。如果令牌已过期,到目前为止我无法获得新令牌,因为我得到令牌不匹配异常。我想要一个新令牌,忽略任何不匹配异常,将其放入 DOM 并让用户再次继续。

我的用户可能会遇到很长的空闲时间,但是当他/她重新激活移动页面时,我希望用户能够从他/她离开的地方继续,而无需让他们重新加载页面并提供初始数据(例如名称)。

【问题讨论】:

    标签: laravel csrf


    【解决方案1】:

    您可以在需要令牌刷新而不刷新页面的页面上使用此脚本:

    <script type="text/javascript">
            var csrfToken = $('[name="csrf_token"]').attr('content');
    
            setInterval(refreshToken, 3600000); // 1 hour 
    
            function refreshToken(){
                $.get('refresh-csrf').done(function(data){
                    csrfToken = data; // the new token
                });
            }
    
            setInterval(refreshToken, 3600000); // 1 hour 
    
        </script>
    

    在你的 routes/web.php 中

    Route::get('refresh-csrf', function(){
        return csrf_token();
    });
    

    您还可以在某些路由上禁用 csrf_token 验证,创建一个中间件,示例如下:

    https://laracasts.com/discuss/channels/general-discussion/l5-disable-csrf-middleware-on-certain-routes

    【讨论】:

    • 嘿,我认为这实际上很聪明。我不确定路由回调是否在 CSRF 中间件之后执行,但我会尝试一下。在这种情况下,我仍然需要使用 Visibility API。看起来很有希望!谢谢。如果它有效,我会接受你的回答。 +1
    • 没问题,如果解决方案适合您的问题,请告诉我
    猜你喜欢
    • 2020-04-01
    • 2017-10-18
    • 2016-02-08
    • 2018-06-05
    • 2023-03-22
    • 2021-10-03
    • 2020-12-18
    • 2021-08-25
    • 2019-10-27
    相关资源
    最近更新 更多