我有一个 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,以便后端微服务现在可以满足用户的请求。也许这里有人知道我需要添加什么到添加标头,因为这需要工作。
我已阅读文档,尝试了不同的插件 - 我测试了其他命令,我已解密令牌并且子信息可用。所以现在我在这里尝试。
你不能指望 request-transformer 插件能神奇地✨检索 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
我没有进一步调查,因为第一个解决方案应该可以正常工作。