通过keycloak认证postgrest api

Posted

技术标签:

【中文标题】通过keycloak认证postgrest api【英文标题】:Authenticate postgrest api through keycloak 【发布时间】:2019-03-19 16:24:06 【问题描述】:

可以通过内置的 JWT 令牌或第三方服务(如 Auth0、Okta 或 Keycloak (http://postgrest.org/en/v5.0/install.html))保护 Postgrest API 的安全

我们只想使用 Keycloak 提供的 JWT,但可用的文档非常有限。

谁能指导我如何通过 keycloak 保护 postgrest api?

谢谢

【问题讨论】:

【参考方案1】:

更新:带有 curl 示例的简单方法

    安装 keycloak,添加领域和客户端 拿到钥匙
curl https://$KEYCLOAK_URL/auth/realms/$REALM/protocol/openid-connect/certs

复制keys 数组的第一个元素并在jwt-secret 变量的postgrest 配置中使用它

    在 postgrest 配置中使用 .preferred_username 作为 role-claim-key 的值

假设您已完成上述操作,您可以测试您的安装:

    获取令牌
curl -X POST https://$KEYCLOAK_URL/auth/realms/$REALM/protocol/openid-connect/token \
 -H "Content-Type: application/x-www-form-urlencoded" \
 -d "username=$USERNAME" \
 -d "password=$PASSWORD" \
 -d 'grant_type=password' \
 -d "client_id=$CLIENT"
    为您的 postgrest 请求使用回复的 access_token 元素
curl -H "Authorization: Bearer $ACCESS_TOKEN" $POSTGREST_URL/your_table

有几种方法可以做到,我只描述一种:

    设置 keycloak 以在令牌中传递您想要的声明。 (您可能想要"role": "username" 类型的声明) 获取 keycloak 正在使用的密钥并将其传递到 postgrest 配置的 jwt-secret 部分 设置 Web 服务器以与 keycloak 通信并获取令牌。 将令牌传递给浏览器 使用令牌访问 postgrest

详情

    在 keycloak 管理控制台中转到:/#/realms/<realm name>/clients/<client id>/mappers 并设置您想要的声明 在#/realms/<realm name>/keys 的keycloak 管理控制台中,您可以获得您的rsa 公钥,将其转换为jwk 格式并将其保存到postgrest 配置中。为了把它翻译成jwk
将其转换为 pem 格式,将其包含在 -----BEGIN PUBLIC KEY----------END PUBLIC KEY----- 将其转换为 jwk 格式。一个不错的工具pem-jwk

    有无限的选择。一个 node js 示例:https://github.com/keycloak/keycloak-nodejs-connect/tree/master/example 使用 keycloak-connect 包

    您可以在req.kauth.grant 阅读令牌并将其放置在您发送到浏览器的 html 的隐藏字段中

    从浏览器读取令牌并将其放置在带有不记名前缀的身份验证标头中。如果你使用 axios

     axios(
       method: 'get',
       url: 'your url',
       headers:  'authorization': `Bearer $token` 
     )
    

【讨论】:

这是否可以在没有单独的 Web 服务器的情况下实现? IE。只使用 Keycloak 和 PostgREST?我希望 PostgREST 可以取代我的后端 Web 服务器。但是,当添加身份验证时,这可能是不可能的? 使用 postgrest 设置 keycloak(前 2 步)后,您可以使用任何您希望的客户端(甚至 curl)来使用 api。一个简单的工作流程是: 1) 使用用户名/密码调用 keycloak 并获取令牌。 2) 使用令牌调用 postgrest。还有一个仅浏览器的 js 客户端 keycloak.org/docs/latest/securing_apps/#_javascript_adapter 但同样您需要一个 Web 服务器来提供相关的静态页面

以上是关于通过keycloak认证postgrest api的主要内容,如果未能解决你的问题,请参考以下文章

为Keycloak添加自定义API

PostgreSQL神器之PostgREST(macos版本使用)

通过API注册后Keycloak自动登录

如何通过 API 在 keycloak 中忘记密码

如何通过 Java/Kotlin API 从 KeyCloak 请求 JWT 令牌

Keycloak : 当新用户注册时通过 API 获得通知