通过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
-----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的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL神器之PostgREST(macos版本使用)