Oauth 2.0 WSO2 APIM-在JWT负载中添加用户角色

Oauth 2.0 WSO2 APIM-在JWT负载中添加用户角色,oauth-2.0,jwt,wso2,wso2-am,Oauth 2.0,Jwt,Wso2,Wso2 Am,我正在开发一些SpringBoot微服务,通过WSO2 APIM公开REST 微服务本身不实现任何类型的身份验证或授权机制,它被委托给APIM 若我将API设置为如上所述使用密码授权,前端应用程序可以进行身份验证并生成JWT令牌 现在的问题是,我无法从JWT有效负载中获取用户角色,因为它不是由APIM添加的。此信息非常重要,因为前端渲染菜单和按钮基于用户角色 生成令牌时我传递的用户确实有一些角色,如下面所示: 但生成的JWT令牌不包含任何关于角色的信息。下面是一个示例令牌: eyJ0eXAiO

我正在开发一些SpringBoot微服务,通过WSO2 APIM公开REST

微服务本身不实现任何类型的身份验证或授权机制,它被委托给APIM

若我将API设置为如上所述使用密码授权,前端应用程序可以进行身份验证并生成JWT令牌

现在的问题是,我无法从JWT有效负载中获取用户角色,因为它不是由APIM添加的。此信息非常重要,因为前端渲染菜单和按钮基于用户角色

生成令牌时我传递的用户确实有一些角色,如下面所示:

但生成的JWT令牌不包含任何关于角色的信息。下面是一个示例令牌:

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5UZG1aak00WkRrM05qWTBZemM1TW1abU9EZ3dNVEUzTVdZd05ERTVNV1JsWkRnNE56YzRaQT09In0.eyJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9hcHBsaWNhdGlvbnRpZXIiOiJVbmxpbWl0ZWQiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC92ZXJzaW9uIjoidjEiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9rZXl0eXBlIjoiUFJPRFVDVElPTiIsImlzcyI6IndzbzIub3JnXC9wcm9kdWN0c1wvYW0iLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9hcHBsaWNhdGlvbm5hbWUiOiJDYWRhc3RybyBkZSBDbGllbnRlcyIsImtleXR5cGUiOiJTQU5EQk9YIiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvZW5kdXNlciI6ImVtaWxpb0BjYXJib24uc3VwZXIiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9lbmR1c2VyVGVuYW50SWQiOiItMTIzNCIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL3N1YnNjcmliZXIiOiJhZG1pbiIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL3RpZXIiOiJVbmxpbWl0ZWQiLCJzY29wZSI6ImRlZmF1bHQiLCJleHAiOiIxNTk5NTYyOTQ4MDI4IiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvYXBwbGljYXRpb25pZCI6IjIiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC91c2VydHlwZSI6IkFwcGxpY2F0aW9uX1VzZXIiLCJjb25zdW1lcktleSI6IktJaTdnUk1RYmg1OWZGbmpVOFhNbnhGcm9pNGEiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9hcGljb250ZXh0IjoiXC9ia25nXC92MSJ9.km4w2V7dGmoGl8f4_ZqKHvdofAPLOOw__GPjWKrpjYelbi7IjDIpRODEZNn8hE1krRdDTSjKRviJ-NBvXtTXIiLdfPh1p-zNtX26vrS77ZcSZ2WsQA7Ku21YMqcm6cyZvEhZ99qfTxOtbJfkwt6Yt8itkyr-aqk83pNp85LTnwtNboib9VOOvh37zNEJUImzKw4WvENp4SGLuHO978FriHyHPN9vibzPjpItW5DOXTFNdN4rP6RK_vcOH6hpuZHwivJpTHxf9qMB3Gd2yTig-Hkr-sZGbx89pQf8kqtCLWbhRG5jOtcEJNf2CSNLB0Glg_e4F6LfhVD5JUCz15jdlg
当我在中提取它时,我得到以下有效载荷:

{
  "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负载?我是否需要实现如上所述的自定义生成器


提前谢谢

获取auth JWT中包含的角色声明的最简单方法是在服务提供者级别添加声明映射,并请求具有openid作用域的令牌。要做到这一点,请尝试以下步骤

  • 登录到管理控制台
    https://:/carbon

  • 在左侧菜单中列出服务提供商

  • 转到所需服务提供商上的编辑(开发者门户中的每个应用程序都有一个映射服务提供商)

  • 将索赔映射添加到
    角色
    索赔,如下所示

  • 使用
    scope=openid
    参数发送令牌请求

    curl -k -X POST https://localhost:8243/token -d "grant_type=password&username=<Username>&password=<Password>&scope=openid" -H "Authorization: Basic <Credentials>"
    

  • 您需要在哪个令牌中包含角色声明?是认证JWT还是后端JWT?实际上,我希望将APIM生成的令牌传递给后端,以便在必要时检查角色,或者让前端的角色根据角色呈现特定内容。这是一个可行的方法吗?如果是,这是一个好的做法吗?您是否尝试了
    ClaimsRetrieverImplClass
    配置。用法记录在“传递最终用户属性…”文档中。是的,它可以工作,但仅对发送到后端的JWT有效,我的意思是,APIM获取请求,检查通过标头发送的JWT,生成新JWT并转发到后端。这个类和文章就是为了这个目的,不是为了客户端JWT吗?我需要的是将JWT的用户角色生成到API客户端。您能确认正在使用的apim版本吗?是的!它是这样工作的。实际上,我做了一些非常不同的事情,在本例中,我设置了IS-KM,并使用OAuth2/OIDC配置了SSO,因此当用户请求访问受保护的资源时,请求被转发到IS登录页,当授予访问权限时,令牌通过回调URL转发。但当您不使用WEB API客户端时,您的方法是完美的。非常感谢。