Kong 请求转换器 - 注入 X-User-Id: {{jwt.claim.sub}}

问题描述 投票:0回答:1

我有一个 kong api 和一个在其后面运行的 apollo-router。为了让我的所有微服务解密令牌,我想在 kong 接受令牌后注入 id。我使用 oauth2 并使用 openID 作为插件,它可以工作。 token有sub,token有效。但是当我尝试添加请求转换器时,标题:X-User-Id: {{jwt.claim.sub}} 我只是在另一边得到它。所以看来Kong没有添加我想要的信息。所以我的系统是插件 OpenID,然后是请求转换器,将此作为“添加标头”X-User-Id:{{jwt.claim.sub}}。我不使用客户或客户组,因为我希望将其注入每个用户中,这样我就不需要解密每个令牌。我只需要可用用户的 ID,以便后端微服务现在可以满足用户的请求。也许这里有人知道我需要添加什么到添加标头,因为这需要工作。

我已阅读文档,尝试了不同的插件 - 我测试了其他命令,我已解密令牌并且子信息可用。所以现在我在这里尝试。

flask jwt header inject kong
1个回答
0
投票

你不能指望 request-transformer 插件能神奇地✨检索 JWT 声明并将它们存储在标头中,这不是它的作用:)


事实

根据文档页面,您可以使用模板,但是:

  • 语法是
    $()
    ,而不是
    {{}}
  • 没有任何处理 JWT 的文档。

可能的解决方案

解决方案:自定义插件

免责声明:我还没有测试过这段代码,因为我现在不在家:)我会尽快测试

创建一个自定义插件,用于检索 JWT(例如,从请求上下文)并将声明存储为标头:

文件

handler.lua

local jwt_decoder = require("kong.plugins.jwt.jwt_parser") local set_header = kong.service.request.set_header local CustomHandler = { VERSION = "1.0.0", PRIORITY = 10, } -- Other stuff function CustomHandler:access(conf) -- Retrieve the token from the context local token = kong.ctx.shared.authenticated_jwt_token if not token then kong.log.warn("Token not found in context") return kong.response.exit(500, "TEST: Token not found in context") end local jwt = jwt_decoder:new(token) local user_id = jwt.claims.sub if not user_id then kong.log.warn("'sub' claim not found in JWT") return kong.response.exit(500, "TEST: 'sub' claim not found in JWT") end -- set the header set_header("X-User-Id", user_id) end return CustomHandler
文件

schema.lua

local typedefs = require "kong.db.schema.typedefs" return { name = "jwt-sub-to-header", fields = { { config = { type = "record", fields = { }, }, }, }, }
然后按照

自定义插件指南安装和使用它。

测试:请求转换器功能

示例:

curl -X POST http://localhost:8001/services/{serviceName|Id}/plugins \ --header "accept: application/json" \ --header "Content-Type: application/json" \ --data ' { "name": "request-transformer", "config": { "add": { "headers": [ "X-User-Id:$((function() -- Load JWT decoder from jwt plugin local jwt_decoder = require(\"kong.plugins.jwt.jwt_parser\") -- Retrieve the token from the context local token = kong.ctx.shared.authenticated_jwt_token if not token then -- Handle missing token in context return end local jwt = jwt_decoder:new(token) local user_id = jwt.claims.sub if not user_id then -- Handle missing sub claim in token return end return user_id end)() )" ] } } } '
此代码应该从请求上下文中检索令牌,解析它,然后添加
标题 

X-User-Id:<sub>

,其中 
<sub>
 是声明值。

但是,我对此进行了测试,由于请求转换器使用沙盒环境来运行 Lua 代码,因此它不起作用。错误如下:

error:/usr/local/share/lua/5.1/kong/tools/sandbox.lua:88: require 'kong.plugins.jwt.jwt_parser' not allowed within sandbox
我没有进一步调查,因为第一个解决方案应该可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.