讨论数量:
开发环境
1. 使用的是apache服务器
2. 本地测试域名配置的是https
3. apache 的 virtual host 中没有开启 SSLEngine on
如果你也是上述开发环境,那么可以打印一下这个值:
$_SERVER['HTTPS'] // 确认值是否为 on,如果是 off 或不存在可以继续往下看
进一步确认
符合以上情况,可以 debug 一下这两个函数中生成出来 url 的值,进行确认
signedRoute(laravel_bbs/vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php:319)
$this->route($name, $parameters, $absolute)
hasCorrectSignature(laravel_bbs/vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php:404)
$queryString = ltrim(preg_replace('/(^|&)signature=[^&]+/', '', $request->server->get('QUERY_STRING')), '&');
我验签失败的问题在于,加密函数 signedRoute 生成出来的 url 是 https://xxx ,而解密函数 hasCorrectSignature 获取到 url 是 http://xxx 。
问题原因
我在项目入口配置了 URL::forceScheme('https')。
这个方法对 route 方法有效,signedRoute 函数中使用 route 方法生成出来的链接是 https://。
而hasCorrectSignature 函数中使用 $https = $this->server->get('HTTPS') 进行判断,这不受 URL::forceScheme('https') 影响,生成出来的 url 为 http:// , 两者签名结果不一致。
解决办法:
apache 配置完整的 ssl
打开认证链接后报403



关于 LearnKu
推荐文章: