Keycloak - 在 JWT 令牌中接收帐户服务角色,但需要自定义角色

Posted

技术标签:

【中文标题】Keycloak - 在 JWT 令牌中接收帐户服务角色,但需要自定义角色【英文标题】:Keycloak - receiving account service roles in JWT token, but expect custom roles 【发布时间】:2021-07-20 05:02:25 【问题描述】:

我使用 Keycloak 对用户进行身份验证。我创建了新领域(Efairy-realm)、客户端(efairy-backend)和新角色(usermoderator em>,管理员)。看起来是这样的:

Config 1 look like this. Config 2 look like this.

问题从access_token开始:


  "exp": 1619466995,
  "iat": 1619466935,
  "jti": "fcd20273-fb45-408c-9e20-126653d69719",
  "iss": "http://localhost:8082/auth/realms/efairy-realm",
  "aud": "account",
  "sub": "b1d89dc2-c12d-4c80-beed-c9a6065ec604",
  "typ": "Bearer",
  "azp": "efairy-backend",
  "session_state": "d4a2b283-2f54-4a17-9a27-99db26278ba7",
  "acr": "1",
  "allowed-origins": [
    "",
    "http://localhost:8083"
  ],
  "realm_access": 
    "roles": [
      "offline_access",
      "uma_authorization"
    ]
  ,
  "resource_access": 
    "efairy-backend": 
      "roles": [
        "uma_protection",
        "user"
      ]
    ,
    "account": 
      "roles": [
        "manage-account",
        "manage-account-links",
        "view-profile"
      ]
    
  ,
  "scope": "profile roles email",
  "clientHost": "172.23.0.1",
  "email_verified": false,
  "clientId": "efairy-backend",
  "groups": [
    "offline_access",
    "uma_authorization"
  ],
  "preferred_username": "service-account-efairy-backend",
  "clientAddress": "172.23.0.1"

我创建了名为 moderator 的新用户,角色为 moderator,当我登录该用户时,我正在接收角色(resource_access.efairy-backend.roles )我在选项卡 Service Account Roles 中设置,但我想在 Role Mappings 选项卡。

User roles looks like this.

登录流程如下所示:

    我使用这些参数将用户从我的前端应用程序重定向到 keyclock 登录页面:/auth/realms/efiary-realm/protocol/openid-connect/auth?response_type=code&client_id=eairy-backend&redirect_uri=http:// localhost:8083/auth-redirect-url

    然后我输入正确的用户名和密码,然后点击登录

    在我重定向到前端应用程序中成功唱歌后,并使用参数请求令牌: /auth/realms/efairy-realm/protocol/openid-connect/tokengrant_type:client_credentialsclient_id:efairy-backend >client_secret:代码:

    回复:

    access_token: "eyJhbGciO...AjbA", expires_in: 60, 非之前政策:1619128217, refresh_expires_in:1799, refresh_token: "eyJ...XQ_R0", 范围:“个人资料角色电子邮件”, session_state: "fcf1391d-...b11795c03f80", token_type: "承载者",

有人知道怎么解决吗? :)

【问题讨论】:

【参考方案1】:

在我重定向到前端应用程序中成功唱歌后,并制作 使用参数请求令牌: /auth/realms/efairy-realm/protocol/openid-connect/token grant_type: client_credentials client_id: efairy-backend client_secret: 代码:

当您执行此操作时,将代表用户 "service-account-efairy-backend" 省略令牌,该用户是 Keycloak 为客户端“efairy-backend”创建的用户。

我创建了一个名为 moderator 的新用户,角色为 moderator,当我 登录到我收到的这个用户 我在选项卡服务中设置的角色(resource_access.efairy-backend.roles) 帐户角色,但我想获得我在 new 中声明的角色 用户在角色映射选项卡中称为主持人。

您将获得您在帐户角色中设置的角色,因为这些角色已分配给客户端(,用户"service-account-efairy-backend")。由于用户 Moderator 不是该交互的一部分,因此角色 moderator 不是令牌的一部分。

此外,客户端凭据不适合前端应用程序。来自source 可以阅读:

客户凭证流程 通过机器对机器 (M2M) 应用程序, 例如 CLI、守护程序或在后端运行的服务, 系统对应用程序而不是用户进行身份验证和授权。为了 这种情况下,典型的身份验证方案,如用户名 + 密码 或社交登录没有意义。相反,M2M 应用程序使用客户端 凭证流(在 OAuth 2.0 RFC 6749,第 4.4 节中定义),在 他们将其客户端 ID 和客户端密码传递给 验证自己并获得令牌。

在我看来,您的第三步可以删除。第二步之后:

然后我输入正确的用户名和密码,然后点击登录

您应该代表用户 Moderator 省略一个令牌。

【讨论】:

以上是关于Keycloak - 在 JWT 令牌中接收帐户服务角色,但需要自定义角色的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak - 通过OIDC端点检索JWT令牌

Spring Security OAuth - 它可以使用 Keycloak 中的 JWT 令牌吗

如何验证在 jwt.io 上使用 Keycloak 身份验证提供程序创建的 HS256 签名 JWT 令牌

如何从 Keycloak JWT 访问令牌中删除属性?

使用带有spring security的keycloak JWT令牌时如何修复403

如何通过 Java/Kotlin API 从 KeyCloak 请求 JWT 令牌