WSO2身份服务器JWT承载

时间:2017-02-22 13:42:06

标签: oauth-2.0 wso2 jwt access-token wso2is

我已在此guide之后在WSO2 IS 5.3.0中安装并配置了JWT授权类型 然后,我配置了一个启用OAuth / OpenID Connect入站身份验证器的服务提供商。 我能够从javascript客户端验证利用Oauth 2协议的用户使用open-id范围获取有效的JWT令牌(JWTToken)。

最后我尝试向https:// **** / oauth2 / token发出POST请求:grant_type = urn:ietf:params:oauth:grant-type:jwt-bearer& assertion =使用REST客户端的JWTToken并设置Content-Type = application / x-www-form-urlencoded。

当我提出请求时,WSOIS服务器会要求输入用户名和密码。我能够通过这一步提供有效的clientId和clientSecret。

不幸的是,此时服务器不会使用访问令牌进行回复,而是使用400错误请求,并且在响应正文中写入“{”error_description“:”在解析租户域碳的身份提供商默认公共证书时出错。超级 “ ”错误“: ”invalid_grant“}”

我无法理解问题是我传递给服务器的JWT令牌还是证书存在问题。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

好。我认为这应该对你有帮助。

如果您从WSO2 Identity Server获取OpenID连接令牌并将其放入jwt.io,您会看到openID connect的“iss”(发布者)值为“https://localhost:9443/oauth2/token” (如果已设置主机名,则将localhost替换为您的主机名),这是WSO2 Identity Server的令牌端点。

因此,当您使用此令牌作为JWT承载授权时,为了验证签名,授权处理程序尝试检索具有在颁发者(iss)字段中指定的名称的IDP(即WSO2 Identity Server的令牌端点) 。由于找不到任何身份提供者,它会检索默认身份提供者(请注意,这是为了向后兼容而添加的虚拟IDP),它没有任何证书。 (您可以在$ IS_HOME / repository / conf / identity / identity-providers / default.xml下找到它)

所以有两种方法可以解决这个问题,

  1. 更改Identity Server的颁发者值,以便它可以获取其常驻身份提供者的证书。

    要做到这一点, 登录管理控制台,

  2. 转到身份提供商 - >居民 - >入站身份验证配置 - > OAuth2 / OpenID Connect配置 - >设置 “身份提供商实体ID”值为 LOCAL

    1. 使用OpenID连接令牌(即令牌端点)的名称等于颁发者值创建新的身份提供者,并上载可用于验证OpenID连接令牌的公共证书。
    2. 就个人而言,我更喜欢第一种解决方案:)

      更新

      您还需要再做一次更改

      在identity.xml(在repository / conf / identity下找到)取消注释以下行

      <Audiences> 
          <Audience>
              ${carbon.protocol}://${carbon.host}:${carbon.manag‌​ement.port}/oauth2/t‌​oken
          </Audience> 
      </Audiences>
      

      这将确保在用作JWT承载授权时,受众验证检查将为已发布的OpenID连接令牌传递。 (即JWT Grant处理程序将验证令牌端点是否是所提供授权中的一个受众)