WSO2 身份服务器 JWT 承载

WSO2 Identity Server JWT Bearer

我已经在 WSO2 IS 5.3.0 中安装并配置了 JWT Grant Type guide 然后我配置了一个启用 OAuth/OpenID Connect Inbound Authenticator 的服务提供商。 我能够从 javascript 客户端对利用 Oauth 2 协议的用户进行身份验证,并获得有效的 JWT 令牌 (JWTToken)。

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

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

不幸的是,此时服务器没有使用访问令牌进行回复,而是使用 400 Bad Request 进行回复,并且在响应正文中写入“{”error_description”:“解码时发生错误 public租户域默认身份提供商证书 carbon.super","error":"invalid_grant"}"

我不明白是我传递给服务器的 JWT 令牌有问题,还是证书有问题。有什么帮助吗?

好的。我想这应该对你有帮助。

如果您使用从 WSO2 身份服务器获得的 OpenID 连接令牌并将其放入 jwt.io you would see that the openID connect will have the "iss" (issuer) value of "https://localhost:9443/oauth2/token”(如果您设置了主机名,请将 localhost 替换为您的主机名)这是 WSO2 身份服务器的令牌端点.

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

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

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

    为此, 登录管理控制台,

转到身份提供者 --> 驻留 --> 入站身份验证配置 --> OAuth2/OpenID 连接配置 --> 设置 'Identity Provider Entity Id' 值为 LOCAL

  1. 创建一个新的身份提供者,其名称等于 OpenID 连接令牌(即令牌端点)的颁发者值,并上传可用于验证 OpenID 连接令牌的 public 证书。

就个人而言,我更喜欢第一种解决方案:)

更新:

你还需要再做一项改变,

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

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

这将确保在用作 JWT 不记名授权时,受众验证检查将通过颁发的 OpenID 连接令牌。 (即 JWT Grant 处理程序将验证令牌端点是否是提供的授权中的受众之一)