sma*_*fan 4 objective-c ios jwt swift 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:我想要实现的是支持非对称密钥的功能,这意味着机密不能同时存储在服务器和客户端应用程序上。我试图实现该应用程序仅包含非机密信息,因此是公钥证书。
不确定你是否仍然坚持这个,但我处于完全相同的情况,花了一段时间才弄清楚。我结束了使用JWT吊舱,并通过在正确的方向推此文章。我将总结我的发现。
由于 Apple 放弃了 OpenSSL 以支持他们自己的安全库,因此输入必须是包含公钥的自签名证书。使用 OpenSSL 使用您的私钥作为输入执行以下操作:
openssl req -key private_key.pem -new -x509 -days 3650 -out selfsigned_cert.pem
Run Code Online (Sandbox Code Playgroud)
然后将PEM格式转为DER,基本上就是去掉b64的装甲:
openssl x509 -outform der -in selfsigned_cert.pem -out selfsigned_cert.der
Run Code Online (Sandbox Code Playgroud)
将 .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];
Run Code Online (Sandbox Code Playgroud)
然后将其插入 JWT 解码器:
JWTBuilder *decodeBuilder = [JWTBuilder decodeMessage:token] // your JWT
.secret(certificateStr)
.algorithmName(algorithmName); // From your token or a predefined string
NSDictionary *payload = decodeBuilder.decode;
Run Code Online (Sandbox Code Playgroud)
您可以通过检查构建器中的错误来检查解码/验证是否成功:
if(decodeBuilder.jwtError != nil) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)
编辑:作为旁注。转换为 DER 然后 b64 编码它似乎是多余的,它基本上只是从 PEM 格式中删除了锚线。我在磁盘上有一个 .der 文件的原因是因为如果需要,我们可以直接使用安全库。