kong 与 keycloak 授权基于范围

Posted

技术标签:

【中文标题】kong 与 keycloak 授权基于范围【英文标题】:kong with keycloak Authorization based on scope 【发布时间】:2020-10-12 02:42:03 【问题描述】:

我期待根据范围限制用户访问。我正在使用Kong API gateway 这是我用于添加nokia-oidc 插件的docker 文件。 https://github.com/nokia/kong-oidc

码头文件:

FROM kong:latest  
USER root
RUN apk update && apk add git unzip luarocks
RUN luarocks install kong-oidc  
USER kong

在令牌中,我得到了“openid 个人资料电子邮件”之类的范围

"session_state": "8d408ace-4692-458c-a7d0-69b19c1ded11",
  "acr": "0",
  "allowed-origins": [
    "*"
  ],
  "scope": "openid profile email",

我正在查看是否存在基于范围的限制,因为 openid 是默认值。

它没有按预期工作。如果令牌中不存在 myscope,我仍然可以登录。

请帮助提前谢谢...!

【问题讨论】:

我只是想知道,除了你所做的之外,你是否将 oidc 插件上的验证范围设置为是? 【参考方案1】:

使用 OIDC 插件,您将无法执行身份验证,但您可以进行授权

你必须使用插件:https://github.com/gbbirkisson/kong-plugin-jwt-keycloak

这将从内部标头 x-access-token 解析 JWT 令牌,并基于您可以通过范围、领域角色和客户端角色对用户进行身份验证。

使用这个 docker 在 Kong 中添加插件

FROM kong:2.0.3-alpine

LABEL description="Alpine + Kong 2.0.3 + kong-oidc plugin"

ENV OIDC_PLUGIN_VERSION=1.1.0-0
ENV JWT_PLUGIN_VERSION=1.1.0-1

USER root
RUN apk update && apk add git unzip luarocks
RUN luarocks install kong-oidc

RUN git clone https://github.com/PSheshenya/kong-oidc.git \
    && cd kong-oidc \
    && luarocks make

RUN luarocks pack kong-oidc $OIDC_PLUGIN_VERSION \
     && luarocks install kong-oidc-$OIDC_PLUGIN_VERSION.all.rock

RUN git clone --branch 20200505-access-token-processing https://github.com/BGaunitz/kong-plugin-jwt-keycloak.git \
    && cd kong-plugin-jwt-keycloak \
    && luarocks make

RUN luarocks pack kong-plugin-jwt-keycloak $JWT_PLUGIN_VERSION \
     && luarocks install kong-plugin-jwt-keycloak-$JWT_PLUGIN_VERSION.all.rock

USER kong

您可能还必须将 JWT-Keyclaok 插件优先级更改为 900 或更少才能在 OIDC 插件之后开始执行。

【讨论】:

如果有人想通过环境变量设置他们的优先级,JWT-Keycloak 中的 handler.lua 文件接受环境变量 JWT_KEYCLOAK_PRIORITY。要在 dockerfile 中执行此操作,只需:ENV JWT_KEYCLOAK_PRIORITY 900【参考方案2】:

Harsh的回答不完整,安装JWT插件https://github.com/gbbirkisson/kong-plugin-jwt-keycloak

接下来,请确保您的 oidc 插件是最新的,如果您在 /usr/local/share/lua/5.1/kong/plugins/oidc/utils.lua 中看到此插件,您应该没问题

function M.injectAccessToken(accessToken)
  ngx.req.set_header("X-Access-Token", accessToken)
end

好的,现在 JWT 插件默认不会检查您的 X-Access-Token 标头,并且它没有给您在 json 配置中编辑它的选项,您将不得不编辑 lua 代码.

/usr/local/share/lua/5.1/kong/plugins/jwt-keycloak/handler.lua 内部,在 cookie_names 检查之后但在 autthorization_header 检查之前添加以下行

local access_header = kong.request.get_header("X-Access-Token")
if access_header ~="" then
    kong.log("X-Access-Token ", access_header)
    return access_header
end

你现在应该可以走了

【讨论】:

感谢您撰写完成答案。 :)

以上是关于kong 与 keycloak 授权基于范围的主要内容,如果未能解决你的问题,请参考以下文章

Kong + Keycloak + OAuth:jwt-keycloak 还是 oauth2 插件?

Kong背后的Keycloak和奇怪的重定向

如何获取 授权API key

使用 Keycloak 和 .NET 核心的基于角色的授权

在反向代理后面使用 Keycloak:无法打开管理员登录页面,因为内容混合

API Gateway - KONG 安装与配置