从Keycloak生成的JWT中确定用户是否有权访问特定资源

时间:2018-09-26 10:04:57

标签: oauth-2.0 authorization jwt openid-connect keycloak

Keycloak docs on OpenID Connect指出

  

访问令牌由领域进行数字签名,并且包含访问权限   应用程序可以用来执行以下操作的信息(例如用户角色映射)   确定允许用户访问的资源   应用

能否通过Keycloak在身份验证后返回的访问令牌来确定允许用户访问哪些资源? 在keycloak quickstart's instructions on Obtaining an OAuth2 Access Token之后,我得到了以下JWT(忽略了不相关的字段):

{
  "aud": "app-authz-springboot",
  "sub": "9c6c4a66-bb14-420f-a8af-3b2771266b38",
  "typ": "Bearer",
  "azp": "app-authz-springboot",
  "realm_access": {
    "roles": [
      "user"
    ]
  },
  "resource_access": {},
  "preferred_username": "alice"
}

有一个空字段

  

resource_access

是否可以用用户可以访问的资源来填充它?这个领域的规格是什么?在JWT RFCOpenID Connect Spec

中找不到它

我尝试了另一种可行的方法:

  1. 获取访问令牌using password credentials flow
  2. Exchanging the obtained token for rpt稍有 修改添加 response_mode 参数:

    curl -v -X POST \
      http://localhost:8180/auth/realms/spring-boot-quickstart/protocol/openid-connect/token \
      -H "Authorization: Bearer "$access_token \
      --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
      --data "audience=app-authz-rest-springboot" \
      --data "permission=Default Resource"
      --data "response_mode=decision"
    

但是,此解决方案要求向Keycloak分派2个请求,以确定是否允许用户使用特定资源。

1 个答案:

答案 0 :(得分:0)

您的使用情况尚不清楚。控制对特定资源的访问的标准机制是 角色 ,您可以将它们作为令牌的一部分来获取。因此,如果您使用适当的角色模型配置对端点的访问,并将所需的角色分配给相应的用户,它将控制访问。实际上,这是在问题中引用的SpringBoot example中管理对/api/premium URL的访问的方式(比较 alice jdoe 的访问)。

从现在的问题出发,目前尚不清楚为什么这种方法对您不起作用,以及您为什么想要其他东西。