如何生成 JWT 以用于 Swift 应用程序的 API 身份验证

Rog*_*gie 2 jwt swift google-cloud-functions jwt-auth

我正在尝试实现对所有 API 调用都需要 JWT 身份验证的 API 服务的使用。

我了解 JWT 令牌是什么以及它们是如何使用的,我的问题是我正在编写一个 Swift 应用程序并且无法弄清楚生成令牌的过程,以便我可以将它作为BearerAPI 调用中的一个附加。

  • 我可以在客户端(swift 应用程序)生成 JWT 令牌吗?
  • 创建一个 Google Cloud 函数来生成令牌,然后写回 Firebase 以在我的 API 调用中使用?

Eri*_*ric 6

以下是如何使用 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)


Zac*_*ers 4

这取决于您计划如何签署令牌。从根本上来说,您需要某种秘密来对 JWT 的有效负载进行签名。

您的秘密是客户端已经拥有的 API 密钥吗?如果是这样,那么在客户端生成它并没有太大的危害。

您的秘密是一个超级秘密的证书,您不能泄露给客户吗?那么您可能会想要采用您的 Firebase 想法。

在这些情况下,让客户端通过 API 密钥进行签名是很常见的,但您一开始锁定 API 的动机才是这里的驱动力。

如果您决定使用客户端, IBM-Swift看起来像是目前最完整的 Swift JWT 库。

如果您决定部署 GC 功能, Jsonwebtoken是一个非常好的 JS 令牌。

这两个库都非常易于使用。