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 下找到它)
所以有两种方法可以解决这个问题,
更改身份服务器的颁发者值,以便它可以获取其常驻身份提供者的证书。
为此,
登录管理控制台,
转到身份提供者 --> 驻留 --> 入站身份验证配置 --> OAuth2/OpenID 连接配置 --> 设置
'Identity Provider Entity Id' 值为 LOCAL
- 创建一个新的身份提供者,其名称等于 OpenID 连接令牌(即令牌端点)的颁发者值,并上传可用于验证 OpenID 连接令牌的 public 证书。
就个人而言,我更喜欢第一种解决方案:)
更新:
你还需要再做一项改变,
在 identity.xml 中(在 repository/conf/identity 下找到)取消注释以下行
<Audiences>
<Audience>
${carbon.protocol}://${carbon.host}:${carbon.management.port}/oauth2/token
</Audience>
</Audiences>
这将确保在用作 JWT 不记名授权时,受众验证检查将通过颁发的 OpenID 连接令牌。 (即 JWT Grant 处理程序将验证令牌端点是否是提供的授权中的受众之一)
我已经在 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 下找到它)
所以有两种方法可以解决这个问题,
更改身份服务器的颁发者值,以便它可以获取其常驻身份提供者的证书。
为此, 登录管理控制台,
转到身份提供者 --> 驻留 --> 入站身份验证配置 --> OAuth2/OpenID 连接配置 --> 设置 'Identity Provider Entity Id' 值为 LOCAL
- 创建一个新的身份提供者,其名称等于 OpenID 连接令牌(即令牌端点)的颁发者值,并上传可用于验证 OpenID 连接令牌的 public 证书。
就个人而言,我更喜欢第一种解决方案:)
更新:
你还需要再做一项改变,
在 identity.xml 中(在 repository/conf/identity 下找到)取消注释以下行
<Audiences>
<Audience>
${carbon.protocol}://${carbon.host}:${carbon.management.port}/oauth2/token
</Audience>
</Audiences>
这将确保在用作 JWT 不记名授权时,受众验证检查将通过颁发的 OpenID 连接令牌。 (即 JWT Grant 处理程序将验证令牌端点是否是提供的授权中的受众之一)