代码之家  ›  专栏  ›  技术社区  ›  Fredrik

Laravel签名路由在生产中引发InvalidSignatureException

  •  1
  • Fredrik  · 技术社区  · 6 年前

    每当我使用时,请访问用 temporarySignedRoute() 生产 InvalidSignatureException . 但是,在 环境,它工作。我也试过使用 signedRoute() 没有运气。

    我创建的网址如下:

    \URL::temporarySignedRoute(
        'user.activate', 
        now()->addHours(200), 
        [ 'id' => $user->id ]
    );
    

    URL示例: https://xx.xx/activate/5?expires=1537065074&signature=f57713b2fccea5ce17b7c1a3241e275d62f1994cd8004ea480cced2402081090

    我已经确定 APP_KEY 已设置。我不确定我应该采取什么措施来解决这个问题。我正在使用拉维尔福吉进行部署。我也使用负载均衡器,但只有一个应用服务器atm。

    为什么是 投掷 在生产中?

    编辑:

    记录请求,我得到以下数据:

    // [ $expired, $url, $query, $original, $signature ]
    [
     false,
     "http://xx.xx/activate/13",{"expires":"1537076308","signature":"9d972a574137bf7e5f30120c3f539a81bca71875020c3476e3bfb230220a73f7"},
     "http://xx.xx/activate/13?expires=1537076308",
     "ed80a6ae717e806fd5f887224c2ac88f5fffb893ae284cc52688ba0690d3a9e1"
    ]
    

    请注意,URL以 http:// 但实际生成的链接是使用 https:// request()->url() . 这让我相信问题在于http方案。

    在我的 AppServiceProvider.php 我是这样的:

    if (env('APP_ENV') == 'production') {
        \URL::forceScheme('https');
    }
    

    为什么是 request() 作为非http接收?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Fredrik    6 年前

        2
  •  0
  •   Josiah Mann    6 年前

    我也遇到了同样的问题,弗雷德里克的回答很有帮助。

    当我在生成签名的url时转储请求时,我看到我的服务器是从“http”而不是“https”请求的,即使站点是通过“https”服务的。我不得不更改我的Cloudflare设置以强制请求使用https。。。