Rog*_*gie 2 jwt swift google-cloud-functions jwt-auth
我正在尝试实现对所有 API 调用都需要 JWT 身份验证的 API 服务的使用。
我了解 JWT 令牌是什么以及它们是如何使用的,我的问题是我正在编写一个 Swift 应用程序并且无法弄清楚生成令牌的过程,以便我可以将它作为BearerAPI 调用中的一个附加。
以下是如何使用 Apple 的 CryptoKit 在 Swift 中制作 JSON Web 令牌。它使用https://jwt.io 中的默认示例
import CryptoKit
extension Data {
func urlSafeBase64EncodedString() -> String {
return base64EncodedString()
.replacingOccurrences(of: "+", with: "-")
.replacingOccurrences(of: "/", with: "_")
.replacingOccurrences(of: "=", with: "")
}
}
struct Header: Encodable {
let alg = "HS256"
let typ = "JWT"
}
struct Payload: Encodable {
let sub = "1234567890"
let name = "John Doe"
let iat = 1516239022
}
let secret = "your-256-bit-secret"
let privateKey = SymmetricKey(data: secret.data(using: .utf8)!)
let headerJSONData = try! JSONEncoder().encode(Header())
let headerBase64String = headerJSONData.urlSafeBase64EncodedString()
let payloadJSONData = try! JSONEncoder().encode(Payload())
let payloadBase64String = payloadJSONData.urlSafeBase64EncodedString()
let toSign = (headerBase64String + "." + payloadBase64String).data(using: .utf8)!
let signature = HMAC<SHA256>.authenticationCode(for: toSign, using: privateKey)
let signatureBase64String = Data(signature).urlSafeBase64EncodedString()
let token = [headerBase64String, payloadBase64String, signatureBase64String].joined(separator: ".")
print(token) // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Run Code Online (Sandbox Code Playgroud)
这取决于您计划如何签署令牌。从根本上来说,您需要某种秘密来对 JWT 的有效负载进行签名。
您的秘密是客户端已经拥有的 API 密钥吗?如果是这样,那么在客户端生成它并没有太大的危害。
您的秘密是一个超级秘密的证书,您不能泄露给客户吗?那么您可能会想要采用您的 Firebase 想法。
在这些情况下,让客户端通过 API 密钥进行签名是很常见的,但您一开始锁定 API 的动机才是这里的驱动力。
如果您决定使用客户端, IBM-Swift看起来像是目前最完整的 Swift JWT 库。
如果您决定部署 GC 功能, Jsonwebtoken是一个非常好的 JS 令牌。
这两个库都非常易于使用。
| 归档时间: |
|
| 查看次数: |
2768 次 |
| 最近记录: |