oauth2.0 Keycloak UMA工作流问题:为什么客户端应该请求RPT令牌而不是资源服务器?

2guxujil  于 2023-08-02  发布在  其他
关注(0)|答案(1)|浏览(116)

我有一个keycloak认证服务器,一个angular前端和一个spring资源服务器(使用OAuth2 /UMA)。目前,我通过前端(Angular ,网页)登录到keycloak并获得访问令牌。当我需要访问一个资源时,我会用我的访问令牌向资源服务器发送一个请求。如果资源服务器需要确保被询问的资源确实是可访问的(例如缺少RPT令牌),则它现在将创建它发送到客户端的票据。客户端会将此票证发送到身份验证服务器,获得更新的令牌(使用rpt,当然只有在允许的情况下),并将该令牌返回到资源服务器,最终取回资源(如果资源服务器同意的话)。
我的问题是:在我的例子中,基本的身份验证是通过angular web客户端进行的,如果需要的话,我宁愿让资源服务器直接与身份验证服务器对话。这看起来不那么麻烦。还是我错过了什么重要的东西?
顺便说一句:我让用户对前端进行身份验证,因为这是不同资源(可能存在于不同的资源服务器上)的入口点。
任何帮助/想法赞赏。
从我所读到的所有内容来看,UMA流程建议资源服务器应该将票据交给客户端(https://docs.kantarainitiative.org/uma/wg/rec-oauth-uma-grant-2.0.html#high-level-flow)。
我觉得,这个场景与我的不同,因为在我的情况下,客户端已经登录,而在这里,对资源服务器的初始客户端请求没有进行身份验证。

**更新:**我想到了一个原因:客户端当然可以存储令牌,因此如果rpt令牌对特定资源有效,则不需要每次都请求新的rpt令牌。spring oauth服务器也能存储这个吗?或者这是不好的做法?

3ks5zfa0

3ks5zfa01#

另一个原因可能是,对于这个流,客户端决定是否要在用户没有访问权限的情况下触发异步授权流。这可以在keycloak中通过在请求RPT时传递submit_request=true选项来完成。
有关更多信息,请参阅:https://www.keycloak.org/docs/latest/authorization_services/index.html#_service_authorization_aat

**编辑:**我做了一些进一步的研究,似乎客户必须请求RPT的主要原因是交互式索赔收集或索赔推送的选项。在某些情况下,授权服务器可能没有所有必要的信息来推断用户是否具有访问权限。因此,在可以发布RPT之前,需要客户端和授权服务器之间的进一步交互(例如,用户必须输入一些附加信息)。


的数据
无论如何,在Keycloak中,还有一个选项可以跳过整个过程,直接从资源服务器评估用户权限,使用附加到请求的访问令牌,如下所示:

curl -X POST \
  http://${host}:${port}/realms/${realm}/protocol/openid-connect/token \
  -H "Authorization: Bearer ${access_token}" \
  --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
  --data "audience={resource_server_client_id}" \
  --data "permission=Resource A#Scope A" \
  --data "permission=Resource B#Scope B"
  --data "response_mode=decision"

字符串
这将以以下格式给予一个结果,指示用户是否具有指定的权限。

{
    'result': true
}


你可以在这里阅读更多:https://www.keycloak.org/docs/latest/authorization_services/index.html#_service_obtaining_permissions

相关问题