keycloak如何确定使用哪种签名算法?

西西西斯

我正在编写一个使用keycloak作为其用户身份验证服务的应用程序。我有普通用户(从前端(Web浏览器)登录到keycloak)和服务用户,从后端(IIS上的PHP)登录。但是,当我从后端登录时,keycloak使用HS256作为访问令牌的签名算法,因此由于在领域和客户端设置中设置了RS256,因此拒绝它进行进一步的通信。为了解决这个问题,我想“假装是前端”来为我的服务用户获取RS256签名的访问令牌。

出于安全原因,我无法将HS256密钥提供给应用程序服务器,因为它是对称的,并且太多人可以访问服务器的代码。

我目前正在前端和后端使用相同的用户/密码/客户端ID /授权类型来调试问题,因此不会成为问题。

到目前为止,我还没有运气尝试过这些:

  • 复制用户代理
  • 复制每个HTTP标头(主机,接受,内容类型,用户代理,接受编码,连接,甚至内容长度与表单数据相同)
  • 仔细检查keycloak登录是否成功-就是,它使用了错误的签名算法

那么keycloak如何确定使用哪种算法对令牌进行签名?如果不同版本之间存在差异,我应该在哪里查看keycloak的代码?

编辑:澄清登录流程以及后端处理它的原因。

如果用户登录,将发生以下情况:

  1. 客户端-[登录数据]-> keycloak服务器
  2. keycloak服务器-[使用直接令牌授予访问和刷新令牌]->客户端
  3. 客户端-[访问令牌]->应用服务器
  4. (应用服务器验证访问令牌)
  5. 应用服务器-[数据]->客户端

但是在某些情况下,第五步的数据是我领域中存在的用户列表。这样做的问题是,密钥斗篷需要具有查看用户角色才能列出用户,该角色仅存在于主领域中,因此我无法使用登录用户的令牌来检索它。
对于这种情况,我在主领域中创建了一个特殊的服务用户,该用户具有view-users角色,并获取如下数据:

  1. 客户端-[询问用户列表]->应用服务器
  2. 应用程序服务器-[服务用户的登录数据]-> keycloak服务器
  3. keycloak服务器-[具有直接授权的访问令牌]->应用服务器
  4. 应用程序服务器-[访问令牌]-> keycloak服务器的获取用户列表API端点
  5. (应用服务器将详细的用户数据过滤为仅用户名列表)
  6. 应用服务器-[用户列表]->客户端

这使得用户名列表实际上是公开的,但是所有其他数据仍对客户端隐藏-出于安全性/隐私原因,我想保留这种方式,因此我不能仅将服务用户的登录数据放在JS中前端变量。

在后一个列表中,步骤4是失败的步骤,因为步骤3返回了HS256签名的访问令牌。在前一个列表中,步骤2正确返回一个RS256签名的访问令牌。

巴萨韦里诺

谢谢你的澄清。如果可以的话,我可能会以不同的方式回答您的问题。当您专注于令牌签名算法时,我认为OAuth2流中存在关于其用法的错误,或者您面临一些误解。

后端和前端都使用“直接访问授予”(指OAuth2流Resources Owner Credentials Grant这一事实,这是错误的主张,或者是您的体系结构中的错误。

如Keycloak自己的文档所述(但在OAuth.2官方参考中也略有不同):

想要代表用户获取令牌的REST客户端使用“资源所有者密码凭据授予(Direct Access Grants)” 这是一个HTTP POST请求,其中包含用户的凭据以及客户端的ID和客户端的机密(如果它是机密客户端)。用户的凭据在表单参数中发送。HTTP响应包含身份,访问和刷新令牌。

据我所见,您描述的应用程序和用例不需要此流程。

我的建议

相反,我在您的流程(1)中看到的是授权代码流程...

  • 假设“客户端”是指浏览器中的普通用户(从您的前端应用重定向到Keycloak身份验证)
  • 并假设您实际上并不需要客户端中的ID和访问令牌,除非您有合理的理由。由于允许的流程被认为是旧的/已弃用,因此不再建议使用。在这种情况下,我们会谈到Implicit FlowPassword Grant现在也不鼓励使用流)。

因此,我认为所提出的交换(您的帖子中第一个顺序为第1至5点)在某些时候是无效的。


对于第二个流程(后端->列表用户),我建议进行两项修改:

  • 允许用户轮询前端应用程序以获取用户列表,然后前端将要求后端将其返回。具有向客户提供服务帐户的后端view-roles将能够获取所需的数据:

     Client (logged) --> Request list.users to FRONTEND app --> Get list.users from BACKEND app
                                                                   (<--> Keycloak Server)
                     <----------------------------------------- Return data.
    
  • 针对此用例,Client Credentials Grant(流)用于后端<> Keycloak交换。该应用将具有service account您可以为其分配特定范围+角色的。它不能代表任何用户使用(即使您可以用另一种方式检索原始请求者也可以!),但是它将以完全安全的方式进行并且保持简单。您甚至可以Client为这些交换定义一个特定bearer-only


毕竟,如果您采用这种方式,则不必担心令牌签名或类似问题。这将根据计划,流程和相关方自动进行处理。我相信,通过错误地利用流量,您最终不得不处理棘手的令牌问题。据我说,这是根本原因,比着重于签名问题更有用。你怎么看?

我错过了什么还是我完全错了...?你告诉我。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何确定使用哪种身份验证方法?

来自分类Dev

“ GROUP BY”如何确定使用哪种聚合方法?

来自分类Dev

SKAdNetwork-生成签名-如何确定使用哪个版本?

来自分类Dev

决定使用哪种机器学习算法

来自分类Dev

如何决定使用哪种布局?

来自分类Dev

如何确定使用哪个版本的HTML?

来自分类Dev

JPA 如何确定使用@OneToOne 或@OneToMany

来自分类Dev

链接器如何决定使用哪种实现

来自分类Dev

使用libmosquitto时如何确定使用的加密类型

来自分类Dev

使用哪种算法来确定坐标是否在特定区域中?

来自分类Dev

编译器如何确定使用哪个函数?

来自分类Dev

如果类中的字段是Record,如何确定使用Rtti

来自分类Dev

如何确定使用熊猫数据框捕获数据?

来自分类Dev

如何确定使用哪个lightdm迎宾器?

来自分类Dev

AWS-如何确定使用服务关联角色的原因?

来自分类Dev

如何确定使用javascript和ajax的学生的字母等级?

来自分类Dev

代码如何确定使用WebSphereRequestUpgradeStrategy和TomcatRequestUpgradeStrategy?

来自分类Dev

如何确定使用哪个lightdm迎宾器?

来自分类Dev

如何确定使用Google API时缺少哪些权限?

来自分类Dev

如何确定使用突变算子突变的基因数量?

来自分类Dev

如何确定使用 CLI 下载的 Foundation Zurb 模板的版本?

来自分类Dev

如何确定我使用的是哪种Ubuntu风格?

来自分类Dev

如何指定使用哪种方法(存储和更新)laravel

来自分类Dev

确定使用哪些软件包

来自分类Dev

确定使用屏障(栅栏)的位置

来自分类Dev

不确定使用C ++指针

来自分类Dev

确定使用屏障(栅栏)的位置

来自分类Dev

无法确定使用Firebase登录Github

来自分类Dev

确定使用jQuery的输入字段的类型

Related 相关文章

热门标签

归档