Lumen API 身份验证使用 API 密钥策略

Lumen API authentication using API key strategy

我正在使用 Lumen 开发 REST API。 (第 8 版)。我需要为我的 REST API 实施基于 API 密钥的身份验证。例如,我将生成一个 API 密钥并将其提供给需要使用我的 API 的第 3 方。为了生成此密钥,我使用的是 JWT。然后我将密钥保存在数据库中。

<?php
namespace App\Http\Middleware; 

use App\ApiKey;
use Closure;

class ApiAuthMiddleware
{
    public function handle($request, Closure $next)
    {
        $tokenValid = ApiKey::where('api_key', $request->header('Authorization'))->exists();

        if (!$tokenValid) {
            return response()->json('Unauthorized', 401);
        } 

        return $next($request);
    }
}

这是我自定义设计的代码,用于检查数据库中的 API 键。我有一些主要的安全问题。

  1. 其他第 3 方将在 header 中发送此令牌,任何可以读取有效载荷的人都可以获得 header 并向我发送具有相同 [=41= 的请求].如何防止这种情况?与客户端密钥有关吗?

  2. 在每个请求中检查MySQL数据库是否可行?这对数据库来说是不必要的工作量吗?我们可以用一个小的 Redis 实例代替它吗?这样安全吗?

我们可以这样设置令牌:

Redis::set('token', 'jwt_token_here');

最后,是否有一个库可以在不使用我的自定义代码的情况下管理它?我觉得这样更安全高效。

提前致谢。

  1. 如果使用HTTPS发送请求,即使请求被拦截,没有服务器私钥也无法解密数据。即使中间人攻击成功,客户端也可以识别它具有不受信任的证书。如果您对安全性有疑虑,您可以使用 RSA 签名验证过程来验证客户端的真实性。客户端将有一个密钥对,其中私钥驻留在客户端应用程序中,每个请求都将使用私钥签名,服务器将使用客户端的 public 密钥验证真实性。请参阅示例 here

  2. PHP 是最常用的服务器端脚本语言之一,它设计用于在每个请求上读取和写入数据库。为了提高效率,您可以使用像 Redis 解释的内存数据库中的缓存方法 here