Contents

william-weng/wwjwtauthenticationtoken

- [Generate JWT authentication token.](https://jwt.io/)

[Introduction - 簡介](https://swiftpackageindex.com/William-Weng)

[WWJWTAuthenticationToken]

[Installation with Swift Package Manager](https://medium.com/彼得潘的-swift-ios-app-開發問題解答集/使用-spm-安裝第三方套件-xcode-11-新功能-2c4ffcf85b4b)

dependencies: [
    .package(url: "https://github.com/William-Weng/WWJWTAuthenticationToken.git", .upToNextMajor(from: "1.0.1"))
]

[可用函式](https://ezgif.com/video-to-webp)

|函式|說明| |-|-| |maker(header:payload:signature:)|產生JWT Token| |maker(algorithm:header:payload:signature:)|產生JWT Token| |apnsMaker(algorithm:keyId:teamId:privateKey:)|產生Apple推播服務的認證Token|

Example

import UIKit
import CryptoKit
import WWJWTAuthenticationToken

final class ViewController: UIViewController {
    
    @IBOutlet weak var resultLabel: UILabel!
        
    @IBAction func displayJWTToken(_ sender: UIBarButtonItem) { jwtDemo() }
    @IBAction func displayAPNSToken(_ sender: UIBarButtonItem) { apnsDemo() }
}

private extension ViewController {
    
    func jwtDemo() {
        
        let header = [
            "alg": "HS256",
            "typ": "JWT"
        ]
        
        let payload: [String : Any] = [
            "sub": "3939889",
            "name": "William.Weng",
            "iat": Int(Date().timeIntervalSince1970)
        ]
        
        let privateKey = """
        -----BEGIN PRIVATE KEY-----
        MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgevZzL1gdAFr88hb2
        OF/2NxApJCzGCEDdfSp6VQO30hyhRANCAAQRWz+jn65BtOMvdyHKcvjBeBSDZH2r
        1RTwjmYSi9R/zpBnuQ4EiMnCqfMPWiZqB4QdbAd0E7oH50VpuZ1P087G
        -----END PRIVATE KEY-----
        """
        
        let result = WWJWTAuthenticationToken.shared.maker(header: header, payload: payload) { base64String in
            
            let signBase64String = "\(base64String.header).\(base64String.payload)"
            
            guard let signData = signBase64String.data(using: .utf8) else { return .success(nil) }
            
            do {
                let privateKey = try P256.Signing.PrivateKey(pemRepresentation: privateKey)
                let signature = try privateKey.signature(for: signData)
                return .success(signature.rawRepresentation)
            } catch {
                return .failure(error)
            }
        }
        
        switch result {
        case .failure(let error): resultLabel.text = error.localizedDescription
        case .success(let token): resultLabel.text = token
        }
    }
    
    func apnsDemo() {
        
        let keyId = "ABCDE12345"
        let teamId = "67890FGHIJ"
        
        let p8 = """
        -----BEGIN PRIVATE KEY-----
        MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgevZzL1gdAFr88hb2
        OF/2NxApJCzGCEDdfSp6VQO30hyhRANCAAQRWz+jn65BtOMvdyHKcvjBeBSDZH2r
        1RTwjmYSi9R/zpBnuQ4EiMnCqfMPWiZqB4QdbAd0E7oH50VpuZ1P087G
        -----END PRIVATE KEY-----
        """
        
        let result = WWJWTAuthenticationToken.shared.apnsMaker(keyId: keyId, teamId: teamId, privateKey: p8)
        
        switch result {
        case .failure(let error): resultLabel.text = error.localizedDescription
        case .success(let token): resultLabel.text = token
        }
    }
}

Package Metadata

Repository: william-weng/wwjwtauthenticationtoken

Default branch: main

README: README.md