You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kong API Gateway特定API密钥自定义逻辑实现方案咨询

Kong API Gateway 自定义API密钥权限控制方案

完全可以通过自定义Kong插件实现你的需求,Kong的插件扩展机制天生支持这类定制化的权限控制场景。以下是具体的方案建议:

一、核心设计思路

  • 绑定密钥与自定义规则:利用Kong的Consumer关联API密钥,同时为每个Consumer(或直接为API密钥)附加自定义配置字段,存储允许访问的前端URL白名单、拦截规则等信息;推荐用Kong内置的metadata字段存储,无需额外修改数据库表结构。
  • 请求拦截校验:在插件的access阶段(请求转发至后端前)执行校验逻辑:
    1. 从请求中提取API密钥,匹配到对应的Consumer记录
    2. 读取该Consumer绑定的前端URL白名单规则
    3. 校验当前请求的Referer(或自定义来源标识)是否在白名单内,不符合则直接返回403 Forbidden

二、插件开发关键步骤

  1. 初始化插件项目
    使用Kong官方插件模板生成基础结构:
    kong plugin new url_restrict_key --v2
    
  2. 定义配置Schema
    在schema.lua中声明插件的可配置字段,确保能关联到Consumer并存储白名单规则:
    return {
      name = "url_restrict_key",
      fields = {
        { consumer = { type = "consumer", required = true } },
        { config = {
            type = "record",
            fields = {
              { allowed_referers = { type = "array", elements = { type = "string" }, required = true } },
              { block_unlisted = { type = "boolean", default = true } }
            }
          }
        }
      }
    }
    
  3. 实现校验逻辑
    在handler.lua的access方法中编写核心校验代码:
    local plugin = require("kong.plugins.base_plugin"):extend()
    
    function plugin:new()
      plugin.super.new(self, "url_restrict_key")
    end
    
    function plugin:access(conf)
      plugin.super.access(self)
      local referer = kong.request.get_header("Referer")
      local allowed = false
    
      if not referer then
        return kong.response.exit(403, { message = "Missing Referer header" })
      end
    
      for _, allowed_url in ipairs(conf.allowed_referers) do
        if string.match(referer, allowed_url) then
          allowed = true
          break
        end
      end
    
      if not allowed then
        return kong.response.exit(403, { message = "Referer not allowed" })
      end
    end
    
    return plugin
    
  4. 安装与绑定配置
    将插件打包安装到Kong后,通过Kong Admin API为指定Consumer绑定插件并传入白名单配置,比如:
    curl -X POST http://kong-admin:8001/consumers/{consumer-id}/plugins \
      -H "Content-Type: application/json" \
      -d '{"name": "url_restrict_key", "config": {"allowed_referers": ["https://app.example.com/*", "https://portal.example.com/*"]}}'
    

三、用户面板集成建议

你的专属用户面板可直接对接Kong Admin API实现以下功能:

  • 创建API密钥:调用/consumers接口创建用户,再调用/consumers/{consumer-id}/key-auth生成API密钥
  • 配置白名单:提供可视化界面让用户添加/删除允许的前端URL,通过/consumers/{consumer-id}/plugins接口更新插件配置
  • 权限隔离:面板需确保用户只能操作自身对应的Consumer及插件配置,避免越权

四、优化方向

  • 缓存优化:将Consumer的白名单配置缓存到Kong内存(利用kong.cache),减少数据库查询次数
  • 规则增强:支持通配符、正则表达式匹配,提升URL白名单的灵活性
  • 审计日志:在插件中添加日志记录,记录拦截请求的密钥、来源URL等信息,便于后续审计

内容的提问来源于stack exchange,提问作者Sandeep Jaiswal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:11:05