2017-04-26 39 views
2

我正在Swift中构建一个iOS应用程序,需要使用RS256或RS512验证具有公钥证书的JWT令牌签名。用Swift iOS验证带有RS256或RS512的JWT令牌

我一直在努力寻找支持这些功能的库,但是我遇到的问题已经被我发现了。

我的问题是什么推荐的方式来实现Swift iOS应用程序的这种功能?

理想的情况是能够使用JWT.io上公认的框架之一。在JWT.io支持RS256或RS512唯一雨燕库是以下库: https://github.com/vapor/jwt

的功能本库支持是理想的,但但它需要通过SWIFT软件包管理器的实现,并使用蒸汽建成。 Swift包管理器目前不支持iOS,但我已经读过,有一些解决方法可以让swift包管理器使用iOS应用程序。如果库可以在iOS应用程序上运行,那么这些解决方案是愿意采取的。然而,由于该库是为Vapor构建的,因此我的问题是,如果甚至有可能让库在我正在构建的iOS应用上运行?

如果无法使用此库,是否还有推荐使用的其他库?如果不是,那么实施这个请求功能的推荐方式是什么?是否推荐可以在应用程序上运行的Objective-C库?

在此先感谢!

编辑: 通过验证我的意思是我想验证令牌中的签名是否正确,这意味着JWT令牌已使用服务器上的私钥对应用程序的公钥证书进行了签名对应。不只是解码Base64Check有效载荷。

编辑2: 我试图做到的,是支持非对称密钥,这意味着该秘密必须被存储在服务器和客户端应用程序上都功能。我试图实现应用程序只包含非保密信息,因此是公钥证书。

+0

您对JWT令牌的验证意味着什么?只要阅读这个令牌? –

+0

你读过关于这个lib https://github.com/kylef/JSONWebToken.swift吗? –

回答

3

不知道你是否仍然坚持这一点,但我处于完全相同的情况,并花了一段时间才弄清楚。我结束了使用JWT pod,并被this文章推向正确的方向。我将总结我的发现。

由于Apple放弃OpenSSL以支持自己的安全库,输入必须是包含公钥的自签名证书。使用OpenSSL使用私钥作为输入做这样的事情:

openssl req -key private_key.pem -new -x509 -days 3650 -out selfsigned_cert.pem 

然后转换为PEM格式DER,它基本上消除了B64装甲:

openssl x509 -outform der -in selfsigned_cert.pem -out selfsigned_cert.der 

添加。明镜文件Supporting Files在您的Xcode项目,然后从磁盘中读取的证书数据和Base64编码,它:

NSURL *fileURL = [NSURL fileURLWithPath:[bundle pathForResource: @"selfsigned_cert" ofType:@"der"]]; 
NSData *certificateData = [NSData dataWithContentsOfURL:fileURL]; 
// Probably want to do a nil-check on certificateData here 
NSString *certificateStr = [JWTBase64Coder base64UrlEncodedStringWithData:certificateData]; 

然后将其插入JWT解码器:

JWTBuilder *decodeBuilder = [JWTBuilder decodeMessage:token] // your JWT 
    .secret(certificateStr) 
    .algorithmName(algorithmName); // From your token or a predefined string 
NSDictionary *payload = decodeBuilder.decode; 

您可以检查是否解码/验证是通过检查在构建器出错成功与否:

if(decodeBuilder.jwtError != nil) { /* do stuff */ } 

编辑:作为边注。转换为DER然后对其进行编码可能看起来多余,它基本上只是从PEM格式中删除锚线。之所以我在磁盘上有.der文件,是因为如果需要的话,我们可以直接使用安全库。

+1

这个答案非常有帮助,应该被接受。 – whitney13625

+0

这让我更接近于归档我的目标,即验证iOS(swift)上使用私有RS256签名的JWT。但答案似乎已经过时,JWT pod更新了几次。任何人都可以提供一个关于如何做到这一点的快速例子?我们是否还需要一个自签名证书或足够的公钥? – iCediCe