49 lines
1.4 KiB
Swift
49 lines
1.4 KiB
Swift
//
|
|
// Copyright Amazon.com Inc. or its affiliates.
|
|
// All Rights Reserved.
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
import CryptoKit
|
|
import Foundation
|
|
|
|
struct CognitoAuthTestHelper {
|
|
|
|
/// Helper to build a JWT Token
|
|
static func buildToken(for payload: [String: String]) -> String {
|
|
|
|
struct Header: Encodable {
|
|
let alg = "HS256"
|
|
let typ = "JWT"
|
|
}
|
|
|
|
let secret = "256-bit-secret"
|
|
let privateKey = SymmetricKey(data: Data(secret.utf8))
|
|
|
|
let headerJSONData = try! JSONEncoder().encode(Header())
|
|
let headerBase64String = headerJSONData.urlSafeBase64EncodedString()
|
|
|
|
let payloadJSONData = try! JSONEncoder().encode(payload)
|
|
let payloadBase64String = payloadJSONData.urlSafeBase64EncodedString()
|
|
|
|
let toSign = Data((headerBase64String + "." + payloadBase64String).utf8)
|
|
|
|
let signature = HMAC<SHA256>.authenticationCode(for: toSign, using: privateKey)
|
|
let signatureBase64String = Data(signature).urlSafeBase64EncodedString()
|
|
|
|
let token = [headerBase64String, payloadBase64String, signatureBase64String].joined(separator: ".")
|
|
|
|
return token
|
|
}
|
|
}
|
|
|
|
fileprivate extension Data {
|
|
func urlSafeBase64EncodedString() -> String {
|
|
return base64EncodedString()
|
|
.replacingOccurrences(of: "+", with: "-")
|
|
.replacingOccurrences(of: "/", with: "_")
|
|
.replacingOccurrences(of: "=", with: "")
|
|
}
|
|
}
|