CupertinoJWT
解析Apple的.p8
私钥文件,并使用ES256算法签署JWT,无需依赖第三方库。支持Apple的服务器端API。
特性
特性 | |
---|---|
开源iOS项目,使用Swift 4编写 | |
支持iOS、macOS、tvOS和watchOS | |
解析Apple的.p8私钥文件 | |
使用ES256算法签署JSON Web Token | |
仅使用Security和CommonCrypto,无需依赖第三方库 | |
支持基于提供者令牌的APNs连接 | |
支持MusicKit | |
支持DeviceCheck | |
支持App Store Connect API |
安装
CocoaPods
您可以通过将以下代码添加到Podfile中来使用CocoaPods安装CupertinoJWT
platform :ios, '10.0'
use_frameworks!
target 'MyApp' do
pod 'CupertinoJWT'
end
如果您在CocoaPods中看到有关脚本阶段的警告,这是因为在CupertinoJWT需要CommonCrypto框架。然而,Apple直到Xcode 10才公开了Swift的相关头部。我们使用脚本阶段来生成module map以在Swift中使用它。
这都是些什么?
苹果拥有多个服务器API,使用JSON Web Token(JWT)作为认证方式,包括苹果推送通知服务(APNs)、MusicKit、DeviceCheck和App Store Connect API。未来可能还有更多。
在创建令牌后,必须使用苹果提供的私钥,通过P-256曲线和SHA-256哈希算法的椭圆曲线数字签名算法(ECDSA)或ES256来对它进行签名。
这个任务非常普遍,并且得到了成熟的服务器端语言如Ruby、Java、Python或JS的良好支持。但是,使用Swift操作就不那么简单了。通常需要使用OpenSSL或其分支,即使在服务器端Swift框架如Vapor或Perfect中也使用OpenSSL的分支。如果你想在iOS上这么做,那就更难了。
就我个人而言,我对在iOS上创建开发者工具很感兴趣。例如,我们可以在开发者工具应用中使用JWT为App Store Connect API。
结果是我们只需要使用苹果的安全和常用加密框架,并支持所有苹果平台。这就是CupertinoJWT所做的事情。
结果是,有了CupertinoJWT,我们可以在iOS(以及macOS、tvOS和watchOS)上轻松创建连接到APNs、App Store Connect或其他苹果服务器API的开发者工具。
CupertinoJWT做什么?
苹果提供的私钥是PEM格式的.p8
文件。CupertinoJWT解析并转换为ASN.1数据,检索私钥,使用SecKeyCreateWithData
方法加载,并最终使用SecKeyCreateSignature
方法创建签名。
用法
首先,从苹果开发者网站获取你的.p8
密钥文件。它可以下载一次。安全地保管文件。(作为一名开发者,你应该知道保管私钥的重要性。)
然后,按照下面的示例代码操作
// Get content of the .p8 file
let p8 = """
-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgGH2MylyZjjRdauTk
xxXW6p8VSHqIeVRRKSJPg1xn6+KgCgYIKoZIzj0DAQehRANCAAS/mNzQ7aBbIBr3
DiHiJGIDEzi6+q3mmyhH6ZWQWFdFei2qgdyM1V6qtRPVq+yHBNSBebbR4noE/IYO
hMdWYrKn
-----END PRIVATE KEY-----
"""
// Assign developer information and token expiration setting
let jwt = JWT(keyID: keyID, teamID: teamID, issueDate: Date(), expireDuration: 60 * 60)
do {
let token = try jwt.sign(with: p8)
// Use the token in the authorization header in your requests connecting to Apple’s API server.
// e.g. urlRequest.addValue(_ value: "bearer \(token)", forHTTPHeaderField field: "authorization")
} catch {
// Handle error
}
贡献
- 欢迎反馈和问题。