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)和新角色(user、moderator 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 令牌中接收帐户服务角色,但需要自定义角色的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security OAuth - 它可以使用 Keycloak 中的 JWT 令牌吗
如何验证在 jwt.io 上使用 Keycloak 身份验证提供程序创建的 HS256 签名 JWT 令牌