使用带有Swift iOS的RS256或RS512验证JWT令牌

时间:2017-04-26 08:54:54

标签: ios objective-c swift jwt vapor

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

我一直在努力寻找支持这些功能的图书馆,但在实施我找到的图书时遇到了问题。

因此,我的问题是为Swift iOS应用程序实现此类功能的推荐方法是什么?

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

这个库支持的功能是理想的,但它需要通过Swift Package Manager实现,并使用Vapor构建。 iOS目前不支持Swift包管理器,但我已经知道有一些解决方法可以让swift包管理器与iOS应用程序一起使用。如果库可以在iOS应用程序上运行,这些是可以采取的解决方法。然而,由于该库是为Vapor构建的,我的问题是,是否有可能让我的iOS应用程序上的库能够运行?

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

提前致谢!

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

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

1 个答案:

答案 0 :(得分:4)

不确定你是否仍然坚持这一点,但我处于完全相同的状况,需要一段时间才能搞清楚。我最终使用了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

将.der文件添加到Xcode项目中的Supporting Files,然后从磁盘读取证书数据,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然后b64编码它似乎是多余的,它基本上只是从PEM格式中删除锚线。我在磁盘上有.der文件的原因是因为我们可以根据需要直接使用安全库。