Keycloak - 通过 OIDC 端点检索 JWT 令牌

T A*_*T A 6 jwt openid-connect keycloak

我当前正在尝试使用 POST 请求(而不是使用指定的适配器之一)从 keycloak 令牌端点检索用户令牌。我已经设置了一个 keycloak 领域并添加了我自己的机器作为客户端。在文档中,令牌端点被描述为:

/realms/{realm-name}/protocol/openid-connect/token
Run Code Online (Sandbox Code Playgroud)

据我阅读的openid 规范,我需要设置 body 参数grant_type=authorization_code以及参数coderedirect_uri。我还需要设置Authorization标头,为此我需要一个基本令牌。

到目前为止我会得到回复:

“error”:“unauthorized_client”,
“error_description”:“INVALID_CREDENTIALS:无效的客户端凭据”

我从哪里获得基本Authorization令牌?我预计我需要提供用户名和密码,因为 JWT 令牌是我试图接收的响应。redirect_url如果我只想请求令牌,是否需要设置?

Xtr*_*ica 3

Keycloak 遵循 OpenId Connect 规范,提供了不止一种检索用户访问令牌的方法。这里有根据 openid connect 规范执行授权代码流(推荐用于 Web 应用程序的代码流)的步骤: https: //rograce.github.io/openid-connect-documentation/explore_auth_code_flow

\n\n

基本上,如果您不使用任何适配器,当检测到对某些受保护资源的请求时,您应该:

\n\n

执行到 keycloak 登录页面的重定向(请记住 keycloak 使用 REALM 实体,因此您也需要指定它):

\n\n
HTTP/1.1 302 Found\n  Location: https://mykeycloakinstance.org/auth/realms/demo/protocol/openid-connect/auth?\n    response_type=code\n    &scope=openid\n    &client_id=s6BhdRkqt3\n    &state=af0ifjsldkj\n    &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb\n
Run Code Online (Sandbox Code Playgroud)\n\n

您需要将状态值保留在客户端中,因为它需要在重定向过程中继续存在:

\n\n
\n

建议 client\xe2\x80\x99s 使用此参数来维护请求和回调之间的状态。通常,跨站点请求伪造(CSRF、XSRF)缓解是通过将此参数的值与浏览器 cookie 进行加密绑定来完成的。

\n
\n\n

您不与用户名/密码进行交互。keycloak 身份验证页面可以。登录成功后,它将使用有效代码重定向到您的页面:

\n\n
HTTP/1.1 302 Found\nLocation: https://client.example.org/cb?\n  code=SplxlOBeZQQYbYS6WxSbIA\n  &state=af0ifjsldkj\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里,您需要检查状态是否是您最初发送的状态(您可能需要使用 cookie 通过网络会话跟踪它),并使用该代码获取令牌。您可以使用以下代码向授权端点执行 POST:

\n\n
POST /auth/realms/demo/protocol/openid-connect/auth HTTP/1.1\nHost: https://mykeycloakinstance.org\nContent-Type: application/x-www-form-urlencoded\nAuthorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW\n\ngrant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA\n  &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是总结的流程,我自己还没有测试过代码,所以请使用它作为示例,如果您考虑,请毫不犹豫地修复它;-)

\n\n

也可以看看:

\n\n\n

  • 根据“3.1.3.1”节。根据 OIDC 规范,如果您的客户端是机密的,则必须仅指定授权标头。如果是公开的,则不需要。然而,Keycloak 无法处理公共客户端,因为这根本不起作用(这可能是OP问题的原因)。 (2认同)