我已在此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令牌还是证书存在问题。有什么帮助吗?
答案 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下找到它)
所以有两种方法可以解决这个问题,
更改Identity Server的颁发者值,以便它可以获取其常驻身份提供者的证书。
要做到这一点, 登录管理控制台,
转到身份提供商 - >居民 - >入站身份验证配置 - > OAuth2 / OpenID Connect配置 - >设置 “身份提供商实体ID”值为 LOCAL
就个人而言,我更喜欢第一种解决方案:)
更新
您还需要再做一次更改
在identity.xml(在repository / conf / identity下找到)取消注释以下行
<Audiences>
<Audience>
${carbon.protocol}://${carbon.host}:${carbon.management.port}/oauth2/token
</Audience>
</Audiences>
这将确保在用作JWT承载授权时,受众验证检查将为已发布的OpenID连接令牌传递。 (即JWT Grant处理程序将验证令牌端点是否是所提供授权中的一个受众)