Oauth 2.0 Key斗篷如何确定使用哪种签名算法?

Oauth 2.0 Key斗篷如何确定使用哪种签名算法?,oauth-2.0,keycloak,access-token,digital-signature,Oauth 2.0,Keycloak,Access Token,Digital Signature,我正在编写一个应用程序,该应用程序使用KeyClope作为其用户身份验证服务。我有普通用户,他们从前端(web浏览器)登录到KeyClope,还有服务用户,他们从后端(IIS上的PHP)登录。但是,当我从后端登录时,keydape使用HS256作为其访问令牌的签名算法,因此拒绝它进行进一步通信,因为在领域和客户端设置中设置了RS256。为了解决这个问题,我想“假装是前端”,为我的服务用户获取RS256签名访问令牌 出于安全原因,我无法将HS256密钥提供给应用程序服务器,因为它是对称的,而且有太

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

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

我目前正在前端和后端使用相同的用户/pw/client id/grant类型调试该问题,因此这不是问题所在

到目前为止,我已经尝试了这些,但没有成功:

  • 复制用户代理
  • 复制每个HTTP头(主机、接受、内容类型、用户代理、接受编码、连接,甚至内容长度与表单数据相同)
  • 仔细检查KeyClope登录是否成功-是的,只是它使用了错误的签名算法
那么keydape如何确定使用哪种算法对令牌进行签名呢?如果不同版本的代码不同,我应该在keybeave的代码中查找答案

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

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

  • 客户端--[登录数据]-->KeyClope服务器
  • KeyClope服务器--[使用直接令牌授予访问和刷新令牌]-->客户端
  • 客户端--[access token]-->应用服务器
  • (应用服务器验证访问令牌)
  • 应用程序服务器--[数据]-->客户端
  • 但在某些情况下,第五步的数据是存在于我的领域中的用户列表。这方面的问题是keydape需要一个查看用户角色来列出用户,它只存在于主域中,因此我无法使用登录用户的令牌来检索它。
    对于本例,我在主域中创建了一个特殊的服务用户,该用户具有查看用户角色,并获得如下数据:

  • 客户端--[请求用户列表]-->应用程序服务器
  • 应用程序服务器--[服务用户的登录数据]-->KeyClope服务器
  • KeyClope服务器--[具有直接授权的访问令牌]-->应用服务器
  • 应用服务器--[access token]->KeyClope服务器的获取用户列表API端点
  • (应用服务器将详细的用户数据过滤为用户名列表)
  • 应用程序服务器--[用户列表]-->客户端
  • 这使得用户名列表实际上是公开的,但所有其他数据仍然对客户端隐藏——出于安全/隐私原因,我希望保持这种方式,因此我不能只将服务用户的登录数据放在前端的JS变量中


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

    感谢您的澄清。如果可以的话,我会回答你的问题,也许会和预期的不同。当您关注令牌签名算法时,我认为您的OAuth2流在使用方面存在错误,或者您面临一些误解

    后端和前端都使用“直接访问授权”,这是指OAuth2流
    资源所有者凭据授权”
    ,这一事实要么是错误的声明,要么是架构中的错误

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

    资源所有者密码凭据授予(直接访问授予)。。。由希望代表服务器获取令牌的REST客户端使用 用户。它是一个HTTP POST请求,包含 用户以及客户端的id和客户端的机密(如果是 机密客户)。用户的凭据在表单中发送 参数。HTTP响应包含标识、访问和刷新 代币

    据我所知,您描述的应用程序和用例不需要这个流程

    我的建议 相反,我在您的流(1)案例中看到的是授权代码流

    • 假设“客户端”指的是浏览器中的普通用户(从前端应用程序重定向到KeyClope auth.)
    • 假设您实际上不需要在客户端中使用id和访问令牌,除非您有合理的理由。因为允许的流被认为是遗留/不推荐的,不再推荐。在这种情况下,我们将谈论
      隐式流
      (现在也不鼓励
      密码授予
      流)
    因此,我认为所提出的交换(第一个序列,在你的帖子中有1到5点)在某一点上是无效的


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

    • 允许用户在前端应用程序中轮询用户列表,然后前端将要求后端返回该列表。对于具有
      查看角色的客户端,拥有服务帐户的后端将能够获取所需数据:

       Client (logged) --> Request list.users to FRONTEND app --> Get list.users from BACKEND app
                                                                     (<--> Keycloak Server)
                       <----------------------------------------- Return data.
      
      客户端(已记录)-->向前端应用程序请求list.users-->从后端应用程序获取list.users
      (密钥斗篷服务器)
      
      谢谢你的澄清。如果可以的话,我会回答你的问题,也许会和预期的不同。当您关注令牌签名算法时,我认为您的OAuth2流在使用方面存在错误,或者您面临一些误解

      事实上