CupertinoJWT 0.2.0

CupertinoJWT 0.2.0

Ethan Huang 维护。



  • 作者:
  • ethanhuang13

CupertinoJWT

GitHub release GitHub top language License Twitter Donate

解析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)MusicKitDeviceCheckApp 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
}

贡献

特别感谢