我目前正在尝试使用POST请求(而不是使用指定的适配器之一)从密钥斗篷令牌端点检索用户令牌。我已经建立了一个密钥斗篷域,并添加了自己的mashine作为客户端。在文档中,令牌端点描述为:
/realms/{realm-name}/protocol/openid-connect/token
据我所读的openid specification,我将需要设置主体参数grant_type=authorization_code
以及参数code
和redirect_uri
。我还需要设置Authorization
标头,为此我需要一个基本令牌。
到目前为止,我将得到答复:
“错误”:“ unauthorized_client”,
“错误描述”: “ INVALID_CREDENTIALS:无效的客户端凭据”
我从哪里获得基本Authorization
令牌?我希望我需要提供一个用户名和一个密码,因为JWT令牌是我试图接收的响应。如果我只想请求令牌,是否需要设置redirect_url
?
答案 0 :(得分:1)
根据OpenId Connect规范,Keycloak提供了多种方法来检索用户访问令牌。根据openid connect规范,这里有步骤针对授权代码流(对于Web应用程序建议一种方法)执行此操作:https://rograce.github.io/openid-connect-documentation/explore_auth_code_flow
基本上,如果您不使用任何适配器,则在检测到对某些受保护资源的请求时,您应该:
执行到密钥库登录页面的重定向(请注意,密钥库使用REALM实体,因此您也需要指定它):
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
在这里,您需要检查状态是否是您最初发送的状态(您可能需要通过网络会话使用Cookie进行跟踪),还需要使用该代码来获取令牌。您可以使用以下代码对授权端点执行POST:
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
这是总结的流程,我没有亲自测试过代码,因此以它为例,如果您考虑;-)
,请毫不犹豫地对其进行修复。另请参见: