3

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

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

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

谢谢

4

1 回答 1

2

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

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

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

  1. 用作postgrest 配置.preferred_username中的值role-claim-key

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

  1. 获取令牌
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"
  1. 使用回复的 access_token 元素来处理您对 postgrest 的请求
curl -H "Authorization: Bearer $ACCESS_TOKEN" $POSTGREST_URL/your_table

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

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

细节

  1. 在 keycloak 管理控制台中转到:/#/realms/<realm name>/clients/<client id>/mappers并设置您想要的声明
  2. 在 keycloak 管理控制台中,#/realms/<realm name>/keys您可以获取您的 rsa 公钥,将其转换为 jwk 格式并将其保存到 postgrest 配置中。为了把它翻译成jwk
  • 通过将其包含在中,将其转换为 pem 格式-----BEGIN PUBLIC KEY----- -----END PUBLIC KEY-----
  • 将其翻译成 jwk 格式。一个不错的工具pem-jwk
  1. 有无限的选择。一个使用 keycloak-connect 包的节点 js 示例:https ://github.com/keycloak/keycloak-nodejs-connect/tree/master/example

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

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

     axios({
       method: 'get',
       url: 'your url',
       headers: { 'authorization': `Bearer ${token}` }
     })
    
于 2018-12-23T05:47:05.127 回答