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插件配置:
这个配置会限制只有与该API绑定的OAuth2客户端生成的令牌才能访问,但这还不够阻止同客户端下不同用户的令牌互用,需要下一步的验证。curl -X PATCH http://<kong-admin-url>/apis/<your-api-id>/plugins/<oauth2-plugin-id> \ -d "config.global_credentials=false"
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代码):
将这个插件打包部署到Kong后,绑定到目标API上,就能强制验证用户与令牌的关联。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
3. 补充:确保令牌生成时正确记录authenticated_userid
确认你的授权码流程在生成令牌时,正确传递了authenticated_userid参数给Kong的令牌端点。如果是自定义授权服务器集成,要确保在获取令牌的请求中包含该字段,这样Kong才会将其写入令牌并在后续请求中传递给上游服务。
内容的提问来源于stack exchange,提问作者Kinglee
相关产品推荐
相关产品推荐

