WSO2 APIM - 在 JWT 有效负载中添加用户角色
Posted
技术标签:
【中文标题】WSO2 APIM - 在 JWT 有效负载中添加用户角色【英文标题】:WSO2 APIM - Add user roles in JWT payload 【发布时间】:2020-12-26 18:15:40 【问题描述】:我正在开发一些通过 WSO2 APIM 公开 REST 的 SpringBoot 微服务。
微服务本身不实现任何类型的身份验证或授权机制,它被委托给 APIM。
如果我按照here 的描述将 API 设置为使用密码授予,前端应用程序可以进行身份验证并生成 JWT 令牌。
现在的问题是我无法从 JWT 有效负载中获取用户角色,因为 APIM 没有添加它。此信息很重要,因为前端会根据用户角色呈现菜单和按钮。
生成令牌时我传递的用户确实具有一些角色,如下所示:
但生成的 JWT 令牌不包含任何有关角色的信息。这是一个示例令牌:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5UZG1aak00WkRrM05qWTBZemM1TW1abU9EZ3dNVEUzTVdZd05ERTVNV1JsWkRnNE56YzRaQT09In0.eyJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9hcHBsaWNhdGlvbnRpZXIiOiJVbmxpbWl0ZWQiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC92ZXJzaW9uIjoidjEiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9rZXl0eXBlIjoiUFJPRFVDVElPTiIsImlzcyI6IndzbzIub3JnXC9wcm9kdWN0c1wvYW0iLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9hcHBsaWNhdGlvbm5hbWUiOiJDYWRhc3RybyBkZSBDbGllbnRlcyIsImtleXR5cGUiOiJTQU5EQk9YIiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvZW5kdXNlciI6ImVtaWxpb0BjYXJib24uc3VwZXIiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9lbmR1c2VyVGVuYW50SWQiOiItMTIzNCIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL3N1YnNjcmliZXIiOiJhZG1pbiIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL3RpZXIiOiJVbmxpbWl0ZWQiLCJzY29wZSI6ImRlZmF1bHQiLCJleHAiOiIxNTk5NTYyOTQ4MDI4IiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvYXBwbGljYXRpb25pZCI6IjIiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC91c2VydHlwZSI6IkFwcGxpY2F0aW9uX1VzZXIiLCJjb25zdW1lcktleSI6IktJaTdnUk1RYmg1OWZGbmpVOFhNbnhGcm9pNGEiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9hcGljb250ZXh0IjoiXC9ia25nXC92MSJ9.km4w2V7dGmoGl8f4_ZqKHvdofAPLOOw__GPjWKrpjYelbi7IjDIpRODEZNn8hE1krRdDTSjKRviJ-NBvXtTXIiLdfPh1p-zNtX26vrS77ZcSZ2WsQA7Ku21YMqcm6cyZvEhZ99qfTxOtbJfkwt6Yt8itkyr-aqk83pNp85LTnwtNboib9VOOvh37zNEJUImzKw4WvENp4SGLuHO978FriHyHPN9vibzPjpItW5DOXTFNdN4rP6RK_vcOH6hpuZHwivJpTHxf9qMB3Gd2yTig-Hkr-sZGbx89pQf8kqtCLWbhRG5jOtcEJNf2CSNLB0Glg_e4F6LfhVD5JUCz15jdlg
当我在https://jwt.io/ 中提取它时,我得到以下有效负载:
"http://wso2.org/claims/applicationtier": "Unlimited",
"http://wso2.org/claims/version": "v1",
"http://wso2.org/claims/keytype": "PRODUCTION",
"iss": "wso2.org/products/am",
"http://wso2.org/claims/applicationname": "Cadastro de Clientes",
"keytype": "SANDBOX",
"http://wso2.org/claims/enduser": "emilio@carbon.super",
"http://wso2.org/claims/enduserTenantId": "-1234",
"http://wso2.org/claims/subscriber": "admin",
"http://wso2.org/claims/tier": "Unlimited",
"scope": "default",
"exp": "1599562948028",
"http://wso2.org/claims/applicationid": "2",
"http://wso2.org/claims/usertype": "Application_User",
"consumerKey": "KIi7gRMQbh59fFnjU8XMnxFroi4a",
"http://wso2.org/claims/apicontext": "/bkng/v1"
如何将用户角色添加到 JWT 有效负载?我是否需要按照here 的描述实现自定义生成器?
提前致谢!
【问题讨论】:
您需要在哪个令牌中包含角色声明?是身份验证 JWT 还是后端 JWT? 实际上,我希望将 APIM 生成的令牌传递给后端以在必要时检查角色,或者在前端获取角色以根据角色呈现特定内容。这是一种可行的方法吗?如果是这样,这是一个好习惯吗? 你尝试ClaimsRetrieverImplClass
配置了吗。用法记录在“传递最终用户属性...”文档中。
是的,它有效,但它仅对发送到后端的 JWT 有效,我的意思是,APIM 获取请求,检查通过标头发送的 JWT,生成新的 JWT 并转发到后端。这个类和文章就是为了这个目的,对客户端 JWT 没有,不是吗?我需要的是生成到 API 客户端的 JWT 的用户角色。
能否确认使用的apim版本?
【参考方案1】:
获取身份验证 JWT 中包含的角色声明的最简单方法是在服务提供者级别添加声明映射并请求具有 openid 范围的令牌。为此,请尝试以下步骤。
登录管理控制台https://<host>:<port>/carbon
在左侧菜单中列出服务提供商
在所需的服务提供者上进行编辑(开发者门户中的每个应用程序都有一个映射服务提供者)
添加声明映射到role
声明如下
使用scope=openid
参数发送令牌请求
curl -k -X POST https://localhost:8243/token -d "grant_type=password&username=<Username>&password=<Password>&scope=openid" -H "Authorization: Basic <Credentials>"
响应访问令牌将包含这种格式的角色
"sub": "admin@carbon.super",
"iss": "https://localhost:9443/oauth2/token",
"groups": [
"Internal/subscriber",
"Internal/creator",
"Application/apim_devportal",
"Application/admin_NewApp_PRODUCTION",
"Internal/publisher",
"Internal/everyone",
"Internal/analytics",
],
...
【讨论】:
是的!它以这种方式工作。实际上我做了一些非常不同的事情,在这种情况下,我设置了一个 IS-KM 并使用 OAuth2/OIDC 配置了 SSO,所以当用户请求访问受保护资源时,请求被转发到 IS 登录页面,当访问被授予时,一个令牌通过回调 URL 转发。但是当您不使用 WEB API 客户端时,您的方法是完美的。谢谢!以上是关于WSO2 APIM - 在 JWT 有效负载中添加用户角色的主要内容,如果未能解决你的问题,请参考以下文章
WSO2IS/APIM:如何在自定义身份验证器中分配用户角色