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

Kong OAuth2授权码流程:authenticated_userid与访问令牌验证异常排查

解决Kong OAuth2令牌跨用户访问的问题

针对你遇到的Kong v0.11.1中,user2能使用user1的OAuth2令牌访问API的问题,核心原因是你设置了config.global_credentials = true——这个配置会让Kong跳过令牌与用户的关联验证,只检查令牌本身的有效性(比如签名、过期时间等)。下面是具体的解决思路和配置步骤:

1. 调整OAuth2插件的全局凭证配置

首先需要关闭全局凭证模式,让Kong先验证令牌所属的客户端与API的关联:

  • 执行命令更新API的OAuth2插件配置:
    curl -X PATCH http://<kong-admin-url>/apis/<your-api-id>/plugins/<oauth2-plugin-id> \
    -d "config.global_credentials=false"
    
    这个配置会限制只有与该API绑定的OAuth2客户端生成的令牌才能访问,但这还不够阻止同客户端下不同用户的令牌互用,需要下一步的验证。

2. 强制验证令牌的authenticated_userid与请求用户匹配

Kong v0.11.1的OAuth2插件本身不会自动验证请求中的用户标识与令牌内的authenticated_userid是否一致,你可以通过以下两种方式实现验证:

方式一:在上游API中验证

当Kong转发请求时,会将令牌中的authenticated_userid通过HTTP头X-OAuth-Authenticated-Userid传递给上游服务。你可以在上游API中检查这个头的值是否与当前请求的用户标识(比如从自定义头X-User-Id、会话或参数中获取)一致,不一致则直接拒绝请求。

方式二:自定义Kong插件(适合有开发能力的场景)

如果你希望在Kong层面完成验证,可以编写一个简单的自定义插件,在访问阶段(access phase)对比令牌中的用户ID与请求携带的用户ID:

  • 插件核心逻辑示例(Lua代码):
    local plugin = {
      PRIORITY = 1000, -- 优先级高于OAuth2插件,确保在OAuth2验证后执行
      VERSION = "0.1",
    }
    
    function plugin:access(conf)
      local token_userid = ngx.var.http_x_oauth_authenticated_userid
      local request_userid = ngx.var.http_x_user_id
    
      if token_userid ~= request_userid then
        return kong.response.error(403, "当前用户无权使用该令牌")
      end
    end
    
    return plugin
    
    将这个插件打包部署到Kong后,绑定到目标API上,就能强制验证用户与令牌的关联。

3. 补充:确保令牌生成时正确记录authenticated_userid

确认你的授权码流程在生成令牌时,正确传递了authenticated_userid参数给Kong的令牌端点。如果是自定义授权服务器集成,要确保在获取令牌的请求中包含该字段,这样Kong才会将其写入令牌并在后续请求中传递给上游服务。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:27:32