keycloak + Kong API 网关

keycloak + Kong API Gateway

我们在 API 网关中使用 keycloak 来处理身份验证 (client/secret)。

Kong api 服务使用 konnect-managed-plugin 引用 keycloak 来验证客户端凭据和 return 持有者令牌。

未来对其他端点的调用使用 oauth2-introspection 通过 keycloak introspection 验证持有者令牌

我几乎可以正常工作了,但是,当我通过 Kong api 网关进行身份验证时,它 return 是一个不记名令牌,但是这个令牌无法自省。

如果我直接向 keycloak 授权,则不记名令牌用于自省。

例如

令牌来自: http://kongapigateway.domain/getOAuthToken

Returns:

{"access_token":"ey..ZiUQyw","expires_in":900,"refresh_expires_in":0,"token_type":"Bearer","not-before-policy":0,"scope":"email profile"}

在使用内省的 kong 中调用 api 端点失败: http://kongapigateway.domain/bookings

{
    "error_description": "The access token is invalid or has expired",
    "error": "invalid_token"
}

直接调用 keycloak 自省也失败了: https://keycloak.domain/auth/realms/{Realms}/protocol/openid-connect/token/introspect

{
    "active": false
}

但是,如果我直接从 keycloak 服务器获取令牌: https://keycloak.domain/auth/realms/{Realms}/protocol/openid-connect/token

{"access_token":"eyJhb...4lT8w","expires_in":900,"refresh_expires_in":0,"token_type":"Bearer","not-before-policy":0,"scope":"email profile"}

令牌适用于两个端点: http://kongapigateway.domain/bookingshttps://keycloak.domain/auth/realms/{Realms}/protocol/openid-connect/token/introspect

那么,为什么在第一种情况下 returned 的令牌内省不起作用

您可以通过将 Keycloak 的前端 URL 设置为您的 public URL 来解决此问题。详情请参考.