我正在使用 Lumen 6.2.0 开发 api,它使用某些参数和令牌获取 GET 请求。当它获取参数时,它以某种方式处理它,然后使用我的 .env 文件中的密钥进行编码,然后将结果与请求提供的令牌进行比较,如果比较结果为真,则用户通过身份验证,否则他不是。所以问题有时是 env() 函数返回 null。它不会经常发生,就像 15 个请求中的 1 个一样,但这对我来说仍然是一个严重的问题。我用谷歌搜索了很多,但发现的方法很少。首先我发现 env() 函数应该只在配置文件中调用,因为 Lumen 没有配置目录和我创建的配置文件,但问题仍然存在。第二个建议是专门针对 Laravel -php artisan config:clear
和php artisan config:cache
但是 Lumen 没有这样的命令,尽管我运行该php artisan cache:clear
命令无济于事。所以这是我的代码:
.env 文件
APP_NAME=Example
APP_ENV=local
APP_KEY=ApPkEyHeRe
APP_DEBUG=true
APP_URL=https://example.com
APP_TIMEZONE=UTC
LOG_CHANNEL=stack
LOG_SLACK_WEBHOOK_URL=
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=dbname
DB_USERNAME=dbuser
DB_PASSWORD=dbpass
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
VK_APP_SECRET=SoMeFaNcYkEy
配置/config.php
<?php
return [
'vk_app_secret' => env('VK_APP_SECRET'),
'events_per_page' => 16
];
和UsersController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class UsersController extends Controller
{
public function check(Request $request) {
$query_params = $request->all();
$sign_params = [];
foreach ($query_params as $name => $value) {
if (strpos($name, 'vk_') !== 0) {
continue;
}
$sign_params[$name] = $value;
}
ksort($sign_params);
$sign_params_query = http_build_query($sign_params);
$secret = config('config.vk_app_secret');
$hash_hmac = hash_hmac('sha256', $sign_params_query, $secret, true);
$base_encode = base64_encode($hash_hmac);
$trim_chars = strtr($base_encode, '+/', '-_');
$sign = rtrim($trim_chars, '=');
$status = $sign === $query_params['sign'];
return json_encode($status);
}
}
我还记录了该算法的每一行,并注意到一个有趣的事情,失败的案例[date] production.INFO:
在日志行之前包含前缀,以及每个成功[date] local.INFO:
的案例所以也许它以某种方式影响了 env() 函数?我也不明白为什么它有时会在我有时记录为生产APP_ENV=local