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

Posted

技术标签:

【中文标题】使用 API 密钥策略的 Lumen API 身份验证【英文标题】:Lumen API authentication using API key strategy 【发布时间】:2021-02-10 14:12:44 【问题描述】:

我正在使用 Lumen 开发 REST API。 (第 8 版)。我需要为我的 REST API 实现基于 API 密钥的身份验证。例如,我将生成一个 API 密钥并将其提供给需要使用我的 API 的第三方。为了生成这个密钥,我使用了 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 密钥。我有一些重大的安全问题。

    其他 3rd 方将在标头中发送此令牌,任何可以读取有效负载的人都可以获取标头并向我发送具有相同标头的请求。如何防止这种情况?与客户端密钥有关吗?

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

我们可以这样设置令牌:

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

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

提前谢谢你。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于使用 API 密钥策略的 Lumen API 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 superagent 和 Lumen API 被 CORS 策略阻止的请求

获取经过身份验证的用户 Laravel/Lumen Passport

未定义身份验证保护驱动程序 [api]。流明、野狗、JWTAuth

在 Lumen 中创建多个身份验证提供程序

Lumen 如何验证用户和客户端

在 Flask 中是不是有使用 API 密钥进行身份验证的公认方法? [关闭]