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

Posted

技术标签:

【中文标题】让当前用户登录 Keycloak 的最简单方法【英文标题】:Simplest way to get current user logged in Keycloak 【发布时间】:2021-05-13 14:13:13 【问题描述】:

我已经在我的 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

让用户当前登录以便我可以显示其名称的最简单 - 最简单的方法是什么?

【问题讨论】:

您想要显示的用户数据是否存储在您自己的数据库中?还是已经可以通过 Keycloak 获得?如果是,请参阅 Keycloak 文档。 存储在keycloak数据库中。 【参考方案1】:

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

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

例如

POST /auth/realms/mmyrealm/protocol/openid-connect/token HTTP/1.1 主机:server.example.com 内容类型:application/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 令牌的代码之前通过令牌服务器进行身份验证

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

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

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

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

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

    如果需要,从 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 实现所有这些。

对Authorization Code流程的各个部分都有很好的总结 https://rograce.github.io/openid-connect-documentation/explore_auth_code_flow

【讨论】:

您好,感谢您的快速回复。您是否在那里描述了两种不同的方式,一种是使用代码发送发布请求,另一种是使用客户端适配器?如果是,我不想使用客户端适配器,因为它改变了我所看到的项目(受保护页面)的结构,我唯一需要的是显示名称。我要检查你发给我的链接“令牌请求的描述”。希望我能解决这个问题(考虑到我现在不知道如何发送 POST 请求)。 另外,如果是的话,如果你知道并且这不是太麻烦,你能解释一下 POST 请求的流程吗,我知道使用生成的 url 上的身份验证代码,我可以使用返回一些信息一个 POST 请求。所以我将代码发送到令牌端点?这会带回一个令牌,然后我可以调用其他方法并获取我需要的用户名?像 token.getUserInfo();或者其他的东西 ?再次感谢您。 我不确定客户端适配器指的是什么。您指的是 Keycloak 客户端适配器吗?这意味着您正在应用程序服务器中运行。 您好,再次感谢您的快速回复,如果您的意思是keycloak.org/downloads -> 客户端适配器没有,我没有运行一个。我唯一要做的就是我在这里的线程中提到的。到目前为止它工作正常,在同一领域下登录其他客户端也可以工作,所以我有 SSO。您是在描述上述两种不同的方法(一种是 POST 请求,另一种是客户端适配器)还是?对不起,我真的很新,仍然很容易混淆。 不,您需要向授权服务器发出多个请求 - 在本例中为 Keycloak。我在答案中添加了 OIDC 代码流的高级摘要

以上是关于让当前用户登录 Keycloak 的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak 梳理

Keycloak 梳理

Keycloak 梳理

Keycloak-connect with express,有没有简单的Keycloak登录方法

Meteor 模板:检查用户是不是登录的最简单方法是啥?

在Android中获取用户当前位置的最简单方法是啥?