让当前用户登录 Keycloak 的最简单方法

问题描述

我已经在我的 maven java web 应用程序上实现了一个非常简单的 keycloak 集成。 假设我直接为 keycloak 登录页面调用 url。

http://localhost:8180/auth/realms/myrealm/protocol/openid-connect/auth?client_id=myclientid&response_type=code&scope=openid&redirect_uri=http//localhost:8080/mypage.html

成功输入我的用户名和密码后,我被重定向到 mypage.html ,网址是这样的

http://localhost:8080/mypage.html?session_state=c9482da3-50ff-4176-bf3c-54227271c661&code=5d4aebda-54d8-41ad-8205-c4d7e021770f.c9482da3-50ff-4176-bf3c-54227271c661.d5c1b6ac-c427-46da-8509-f2689849103b

如果我分解它

http://localhost:8080/mypage.html?
session_state=c9482da3-50ff-4176-bf3c-54227271c661&
code=5d4aebda-54d8-41ad-8205-c4d7e021770f.c9482da3-50ff-4176-bf3c-54227271c661.d5c1b6ac-c427-46da-8509-f2689849103b

获取当前登录用户以便显示名称的最简单 - 最简单的方法是什么?

解决方法

查看您提出的请求,您还没有完成 OIDC 代码流。

我假设您的 Java 应用程序充当 OIDC 客户端,在这种情况下,它需要通过调用您领域的令牌端点来交换访问、id 和刷新令牌的授权代码。

例如

POST /auth/realms/mmyrealm/protocol/openid-connect/token HTTP/1.1 主机:server.example.com 内容类型:应用程序/x-www-form-urlencoded 授权:基本 czZCaGRSa3F0MzpnWDFmQmF0M2JW

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA &redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb

A description of the Token Request

最简单的方法是使用 Java OIDC 客户端或 OAuth2 客户端为您进行授权和代码交换,并提供 OAuth2/OIDC 令牌原语供您进行编码。

看看: Scribe Java OAuth2 client Nimbus OIDC SDK

如果您在令牌中包含用户声明,则用户的详细信息将包含在令牌端点返回的令牌中的声明中。

编辑: OIDC 授权代码流程是 OIDC 授权流程之一。它提供了不向用户代理公开任何实际令牌的好处 - 例如Web 浏览器 - 并允许 oidc 客户端在交换 OIDC 令牌代码之前向令牌服务器进行身份验证

在高层次上会发生以下情况:

  1. OIDC 客户端发出身份验证请求

  2. 客户端进行身份验证 - 这可能是最终用户

  3. 授权服务器在重定向时向客户端返回授权代码

  4. OIDC 客户端从授权服务器的令牌端点检索访问、ID 和刷新令牌

  5. 如果需要,从 UserInfo 端点检索用户信息或使用自省端点检查访问令牌

实际用户的详细信息将在 ID 令牌中声明,这是一个普通的 JWT。 Keycloak 也允许您将声明嵌入到访问令牌中。

在使用 Keycloak 进行身份验证后,您将被重定向回您的 Web 应用程序重定向 URI。

根据您的细分

http://localhost:8080/mypage.html?
session_state=c9482da3-50ff-4176-bf3c-54227271c661&
code=5d4aebda-54d8-41ad-8205-c4d7e021770f.c9482da3-50ff-4176-bf3c-54227271c661.d5c1b6ac-c427-46da-8509-f2689849103b

您的请求处理程序需要从该请求中提取代码,然后再次调用 keycloak 以交换访问、ID 和刷新令牌的授权代码

例如

POST /auth/realms/myrealm/protocol/openid-connect/token HTTP/1.1
Host: localhost:8180
ContentType: application/x-www-form-urlencoded
Authorization: <whatever method your oidc client is usingL
grant_type=authorization_code&
code=5d4aebda-54d8-41ad-8205-c4d7e021770f.c9482da3-50ff-4176-bf3c-54227271c661.d5c1b6ac-c427-46da-8509-f2689849103b&
client_id=myclientid&
redirect_uri=....

理想情况下,您有一个用于接受令牌的路由处理程序 - 可能是一个令牌端点,它也接受指示原始 uri 请求的查询参数,以便您可以重定向回该请求,如果这是面向用户的 Web 应用程序。 如果它是完全程序化的,那么您可以使用 nimbus sdk 来实现所有这些。

对授权码流程的各个部分进行了很好的总结 https://rograce.github.io/openid-connect-documentation/explore_auth_code_flow