我当前正在尝试使用POST请求(而不是使用指定的适配器之一)从KeyCloak令牌端点检索用户令牌。我已经设置了一个KeyCloak领域,并添加了自己的机器作为客户。在文档中,令牌端点被描述为:
/realms/{realm-name}/protocol/openid-connect/token
据我在OpenID规范中阅读,我将需要设置Body参数grant_type=authorization_code
以及参数code
和redirect_uri
。我还需要设置Authorization
标头,为此我需要一个基本的令牌。
到目前为止,我将得到答复:
"错误":'unuterorized_client;&quot" invalid_credentials:无效的客户凭据"
从哪里获得基本的Authorization
令牌?我希望我需要提供一个用户名和密码,因为JWT令牌是我试图作为响应收到的内容。如果我只想请求令牌,我需要设置redirect_url
吗?
按照OpenID Connect Spec,KeyCloak提供了多种检索用户访问令牌的方法。在这里,您可以根据OpenID Connect Spec:https://rograce.github.io/openid-connect-documentation/explore_auth_code_code_code_flow ,在这里,您可以采取步骤来进行授权代码流(推荐用于Web应用程序)。
基本上,如果您不使用任何适配器,则在检测到某些受保护资源的请求时:
执行重定向到KeyCloak登录页面(请记住KeyCloak使用领域实体,因此您也需要指定它):
HTTP/1.1 302 Found
Location: https://mykeycloakinstance.org/auth/realms/demo/protocol/openid-connect/auth?
response_type=code
&scope=openid
&client_id=s6BhdRkqt3
&state=af0ifjsldkj
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
您需要将状态价值保留在客户端中,因为它需要在重定向过程中生存:
建议客户使用此参数维护状态 在请求和回调之间。通常,跨站点请求 伪造(CSRF,XSRF)缓解措施是通过密码结合的 使用浏览器cookie的该参数的值。
您不与用户名/密码进行交互。KeyCloak身份验证页面确实如此。登录成功后,它将使用有效的代码重定向到您的页面:
HTTP/1.1 302 Found
Location: https://client.example.org/cb?
code=SplxlOBeZQQYbYS6WxSbIA
&state=af0ifjsldkj
在这里,您需要检查状态是否是您最初发送的状态(您可能需要通过Web会话,使用cookie进行跟踪),并使用该代码获得令牌。您可以使用此代码执行授权端点的帖子:
POST /auth/realms/demo/protocol/openid-connect/auth HTTP/1.1
Host: https://mykeycloakinstance.org
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
这是摘要的流程,我没有亲自测试过代码,所以以示例为例,如果考虑考虑,请随时修复; - )
另请参阅:
- 什么是KeyCloak的OAuth2/OpenID连接端点?