2

我正在使用 Lumen 6.2.0 开发 api,它使用某些参数和令牌获取 GET 请求。当它获取参数时,它以某种方式处理它,然后使用我的 .env 文件中的密钥进行编码,然后将结果与请求提供的令牌进行比较,如果比较结果为真,则用户通过身份验证,否则他不是。所以问题有时是 env() 函数返回 null。它不会经常发生,就像 15 个请求中的 1 个一样,但这对我来说仍然是一个严重的问题。我用谷歌搜索了很多,但发现的方法很少。首先我发现 env() 函数应该只在配置文件中调用,因为 Lumen 没有配置目录和我创建的配置文件,但问题仍然存在。第二个建议是专门针对 Laravel -php artisan config:clearphp 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

在此处输入图像描述

4

0 回答 0