如何从WSO2 API Manager验证JWT

时间:2014-03-14 15:00:28

标签: validation wso2 jwt wso2-am

在后端Web服务位于单独的服务器上并且需要确定给定请求通过APIM网关身份验证的情况下,验证特定API Manager实例是否发出JWT的推荐方法是什么?授权机制?

我知道JWT中的标题字段包含一个'x5t'字段,它是对租户密钥存储区中证书的编码引用,详见此处:

https://asankastechtalks.wordpress.com/2013/12/05/obtaining-certificate-used-to-sign-a-jwt/

由于后端Web服务位于单独的服务器上,我们是否需要以某种方式将公钥分发给它?另外,我们如何更新用于签署JWT的证书,因为它现在使用默认值?

3 个答案:

答案 0 :(得分:1)

x5t中的数据不是整个证书,它只是一个哈希,可以帮助您确定您拥有的证书是否相同。这意味着您需要将公共证书上载到接收服务。

使用https可以在握手中检索公共证书,然后客户端可以检查此证书是否由受信任的CA签名。然而,通过此验证,没有这样的机制,因此您不能只信任您必须信任每个公共证书的CA.

还有另一个可选标题'x5u',其中包含指向公共证书的URL链接,但APIM未设置该值。

答案 1 :(得分:1)

这是您可以使用WSO2令牌中的x5t哈希作为查找从本地存储获取证书的方法:

// Use JwtSecurityTokenHandler to validate the JWT token
var tokenHandler = new JwtSecurityTokenHandler();

// Read the JWT
var parsedJwt = tokenHandler.ReadToken(token);

// Get X509 public certificate
var signerAlgorithm = ((JwtSecurityToken)parsedJwt).SignatureAlgorithm;
var signerHash = ((JwtSecurityToken)parsedJwt).Header["x5t"];
var thumbprint = Encoding.UTF8.GetString(Convert.FromBase64String(signerHash.ToString()));

X509Store store = new X509Store(StoreName.TrustedPublisher);
store.Open(OpenFlags.ReadOnly);
var cert = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false)[0];

答案 2 :(得分:0)

我认为您可以通过在身份提供者下的API管理器中导入证书来验证JWT。

想象一下,您正在使用Wso2 IS生成JWT令牌,那么您需要导出IS证书并将其导入wso2 api管理器中。并且您必须验证密钥“ IDTokenIssuerID”在IS和API中是否相同经理

我认为这篇文章可以帮助您了解:https://medium.com/wso2-learning/how-to-protect-your-apis-with-self-contained-access-token-jwt-using-wso2-api-manager-and-wso2-75673d8a4686