From af6edc5a3e2e1b90c48329cdd3690f1fe28fbed8 Mon Sep 17 00:00:00 2001 From: Ivan C Myrvold Date: Thu, 18 Apr 2024 09:14:32 +0200 Subject: [PATCH] Updated to modern Swift concurrency and newest JWT and JWTKit --- .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 35691 bytes .../xcschemes/xcschememanagement.plist | 58 +++ Package.resolved | 386 +++++++++++------- Package.swift | 12 +- .../Application+FirebaseJWT.swift | 17 +- .../FirebaseJWTMiddleware.swift | 17 +- .../FirebaseJWTPayload.swift | 24 +- .../Request+FirebaseJWT.swift | 42 +- 9 files changed, 361 insertions(+), 202 deletions(-) create mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata create mode 100644 .swiftpm/xcode/package.xcworkspace/xcuserdata/imyrvold.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 .swiftpm/xcode/xcuserdata/imyrvold.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/imyrvold.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/imyrvold.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..682d657ad57ec4bf9d6a14a926cc9815ccd281fc GIT binary patch literal 35691 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 ZUQ@iMjJ6s@F}D7dFR=c#{hl)J{{inoz$^d& literal 0 HcmV?d00001 diff --git a/.swiftpm/xcode/xcuserdata/imyrvold.xcuserdatad/xcschemes/xcschememanagement.plist b/.swiftpm/xcode/xcuserdata/imyrvold.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..8bf573b --- /dev/null +++ b/.swiftpm/xcode/xcuserdata/imyrvold.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,58 @@ + + + + + SchemeUserState + + Demo (Playground) 1.xcscheme + + isShown + + orderHint + 3 + + Demo (Playground) 2.xcscheme + + isShown + + orderHint + 4 + + Demo (Playground).xcscheme + + isShown + + orderHint + 2 + + FirebaseJWTMiddleware.xcscheme_^#shared#^_ + + orderHint + 0 + + vapor-firebase-jwt-middleware-Package.xcscheme_^#shared#^_ + + orderHint + 1 + + + SuppressBuildableAutocreation + + FirebaseJWTMiddleware + + primary + + + FirebaseJWTMiddlewareTests + + primary + + + vapor-firebase-jwt-middleware + + primary + + + + + diff --git a/Package.resolved b/Package.resolved index c268a94..d74145e 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,151 +1,239 @@ { - "object": { - "pins": [ - { - "package": "async-http-client", - "repositoryURL": "https://github.com/swift-server/async-http-client.git", - "state": { - "branch": null, - "revision": "037b70291941fe43de668066eb6fb802c5e181d2", - "version": "1.1.1" - } - }, - { - "package": "async-kit", - "repositoryURL": "https://github.com/vapor/async-kit.git", - "state": { - "branch": null, - "revision": "1f145cffe2109d0fc420bc03b31dacf9de2c7573", - "version": "1.0.0" - } - }, - { - "package": "console-kit", - "repositoryURL": "https://github.com/vapor/console-kit.git", - "state": { - "branch": null, - "revision": "7a97a5ea7fefe61cf2c943242113125b0f396a98", - "version": "4.1.0" - } - }, - { - "package": "jwt", - "repositoryURL": "https://github.com/vapor/jwt.git", - "state": { - "branch": null, - "revision": "a37a1519db3d5ee8fca8f4d5eb63bf4c02f83e0e", - "version": "4.0.0-rc.1.1" - } - }, - { - "package": "jwt-kit", - "repositoryURL": "https://github.com/vapor/jwt-kit.git", - "state": { - "branch": null, - "revision": "c4111580bbf37aefd5182a93ecb2906a216199b3", - "version": "4.0.0-rc.1.3" - } - }, - { - "package": "routing-kit", - "repositoryURL": "https://github.com/vapor/routing-kit.git", - "state": { - "branch": null, - "revision": "35da702471cbcc308f58d38aa8fea971fa3fb166", - "version": "4.0.0" - } - }, - { - "package": "swift-backtrace", - "repositoryURL": "https://github.com/swift-server/swift-backtrace.git", - "state": { - "branch": null, - "revision": "f2fd8c4845a123419c348e0bc4b3839c414077d5", - "version": "1.2.0" - } - }, - { - "package": "swift-crypto", - "repositoryURL": "https://github.com/apple/swift-crypto.git", - "state": { - "branch": null, - "revision": "d67ac68d09a95443303e9d6e37b34e7ba101d5f1", - "version": "1.0.1" - } - }, - { - "package": "swift-log", - "repositoryURL": "https://github.com/apple/swift-log.git", - "state": { - "branch": null, - "revision": "74d7b91ceebc85daf387ebb206003f78813f71aa", - "version": "1.2.0" - } - }, - { - "package": "swift-metrics", - "repositoryURL": "https://github.com/apple/swift-metrics.git", - "state": { - "branch": null, - "revision": "708b960b4605abb20bc55d65abf6bad607252200", - "version": "2.0.0" - } - }, - { - "package": "swift-nio", - "repositoryURL": "https://github.com/apple/swift-nio.git", - "state": { - "branch": null, - "revision": "e876fb37410e0036b98b5361bb18e6854739572b", - "version": "2.16.0" - } - }, - { - "package": "swift-nio-extras", - "repositoryURL": "https://github.com/apple/swift-nio-extras.git", - "state": { - "branch": null, - "revision": "b4dbfacff47fb8d0f9e0a422d8d37935a9f10570", - "version": "1.4.0" - } - }, - { - "package": "swift-nio-http2", - "repositoryURL": "https://github.com/apple/swift-nio-http2.git", - "state": { - "branch": null, - "revision": "82eb3fa0974b838358ee46bc6c5381e5ae5de6b9", - "version": "1.11.0" - } - }, - { - "package": "swift-nio-ssl", - "repositoryURL": "https://github.com/apple/swift-nio-ssl.git", - "state": { - "branch": null, - "revision": "ae213938e151964aa691f0e902462fbe06baeeb6", - "version": "2.7.1" - } - }, - { - "package": "vapor", - "repositoryURL": "https://github.com/vapor/vapor.git", - "state": { - "branch": null, - "revision": "ad2aeccfbdd1275c0a8817a8024f0b98d65e3880", - "version": "4.0.0-rc.3.12" - } - }, - { - "package": "websocket-kit", - "repositoryURL": "https://github.com/vapor/websocket-kit.git", - "state": { - "branch": null, - "revision": "f46778e3f1452cc80a0a6c422cdc52a5d0258795", - "version": "2.0.0" - } - } - ] - }, - "version": 1 + "pins" : [ + { + "identity" : "async-http-client", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swift-server/async-http-client.git", + "state" : { + "revision" : "fb308ee72f3d4c082a507033f94afa7395963ef3", + "version" : "1.21.0" + } + }, + { + "identity" : "async-kit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/vapor/async-kit.git", + "state" : { + "revision" : "7ece208cd401687641c88367a00e3ea2b04311f1", + "version" : "1.19.0" + } + }, + { + "identity" : "bigint", + "kind" : "remoteSourceControl", + "location" : "https://github.com/attaswift/BigInt.git", + "state" : { + "revision" : "0ed110f7555c34ff468e72e1686e59721f2b0da6", + "version" : "5.3.0" + } + }, + { + "identity" : "console-kit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/vapor/console-kit.git", + "state" : { + "revision" : "a31f44ebfbd15a2cc0fda705279676773ac16355", + "version" : "4.14.1" + } + }, + { + "identity" : "jwt", + "kind" : "remoteSourceControl", + "location" : "https://github.com/vapor/jwt.git", + "state" : { + "revision" : "690a134c7135fad8238526d2e07ea6e1b3599694", + "version" : "5.0.0-beta.2" + } + }, + { + "identity" : "jwt-kit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/vapor/jwt-kit.git", + "state" : { + "revision" : "6c04622461084a130e119a5f3b5c8afcfc78114c", + "version" : "5.0.0-beta.2.1" + } + }, + { + "identity" : "multipart-kit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/vapor/multipart-kit.git", + "state" : { + "revision" : "12ee56f25bd3fc4c2d09c2aa16e69de61dc786e8", + "version" : "4.6.0" + } + }, + { + "identity" : "routing-kit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/vapor/routing-kit.git", + "state" : { + "revision" : "2a92a7eac411a82fb3a03731be5e76773ebe1b3e", + "version" : "4.9.0" + } + }, + { + "identity" : "swift-algorithms", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-algorithms.git", + "state" : { + "revision" : "f6919dfc309e7f1b56224378b11e28bab5bccc42", + "version" : "1.2.0" + } + }, + { + "identity" : "swift-asn1", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-asn1.git", + "state" : { + "revision" : "c7e239b5c1492ffc3ebd7fbcc7a92548ce4e78f0", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-atomics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-atomics.git", + "state" : { + "revision" : "cd142fd2f64be2100422d658e7411e39489da985", + "version" : "1.2.0" + } + }, + { + "identity" : "swift-certificates", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-certificates.git", + "state" : { + "revision" : "bc566f88842b3b8001717326d935c2d113af5741", + "version" : "1.2.0" + } + }, + { + "identity" : "swift-collections", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-collections.git", + "state" : { + "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", + "version" : "1.1.0" + } + }, + { + "identity" : "swift-crypto", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-crypto.git", + "state" : { + "revision" : "f0525da24dc3c6cbb2b6b338b65042bc91cbc4bb", + "version" : "3.3.0" + } + }, + { + "identity" : "swift-http-types", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-http-types", + "state" : { + "revision" : "12358d55a3824bd5fed310b999ea8cf83a9a1a65", + "version" : "1.0.3" + } + }, + { + "identity" : "swift-log", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-log.git", + "state" : { + "revision" : "e97a6fcb1ab07462881ac165fdbb37f067e205d5", + "version" : "1.5.4" + } + }, + { + "identity" : "swift-metrics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-metrics.git", + "state" : { + "revision" : "708b960b4605abb20bc55d65abf6bad607252200", + "version" : "2.0.0" + } + }, + { + "identity" : "swift-nio", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio.git", + "state" : { + "revision" : "fc63f0cf4e55a4597407a9fc95b16a2bc44b4982", + "version" : "2.64.0" + } + }, + { + "identity" : "swift-nio-extras", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-extras.git", + "state" : { + "revision" : "a3b640d7dc567225db7c94386a6e71aded1bfa63", + "version" : "1.22.0" + } + }, + { + "identity" : "swift-nio-http2", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-http2.git", + "state" : { + "revision" : "0904bf0feb5122b7e5c3f15db7df0eabe623dd87", + "version" : "1.30.0" + } + }, + { + "identity" : "swift-nio-ssl", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-ssl.git", + "state" : { + "revision" : "7c381eb6083542b124a6c18fae742f55001dc2b5", + "version" : "2.26.0" + } + }, + { + "identity" : "swift-nio-transport-services", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-nio-transport-services.git", + "state" : { + "revision" : "6cbe0ed2b394f21ab0d46b9f0c50c6be964968ce", + "version" : "1.20.1" + } + }, + { + "identity" : "swift-numerics", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-numerics.git", + "state" : { + "revision" : "0a5bc04095a675662cf24757cc0640aa2204253b", + "version" : "1.0.2" + } + }, + { + "identity" : "swift-system", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-system.git", + "state" : { + "revision" : "025bcb1165deab2e20d4eaba79967ce73013f496", + "version" : "1.2.1" + } + }, + { + "identity" : "vapor", + "kind" : "remoteSourceControl", + "location" : "https://github.com/vapor/vapor.git", + "state" : { + "revision" : "096c51992b1c32695c0e17329d1eeda45e026a9d", + "version" : "4.92.7" + } + }, + { + "identity" : "websocket-kit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/vapor/websocket-kit.git", + "state" : { + "revision" : "4232d34efa49f633ba61afde365d3896fc7f8740", + "version" : "2.15.0" + } + } + ], + "version" : 2 } diff --git a/Package.swift b/Package.swift index 427185d..efb97cf 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.2 +// swift-tools-version:5.9 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -6,19 +6,21 @@ import PackageDescription let package = Package( name: "FirebaseJWTMiddleware", platforms: [ - .macOS(.v10_15) + .macOS(.v13) ], products: [ .library(name: "FirebaseJWTMiddleware", targets: ["FirebaseJWTMiddleware"]), ], dependencies: [ - .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0-rc"), - .package(url: "https://github.com/vapor/jwt.git", from: "4.0.0-rc"), + .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0"), + .package(url: "https://github.com/vapor/jwt.git", from: "5.0.0-beta.2"), + .package(url: "https://github.com/vapor/jwt-kit.git", from: "5.0.0-beta.2.1"), ], targets: [ .target(name: "FirebaseJWTMiddleware", dependencies: [ .product(name: "Vapor", package: "vapor"), - .product(name: "JWT", package: "jwt") + .product(name: "JWT", package: "jwt"), + .product(name: "JWTKit", package: "jwt-kit"), ]), .testTarget(name: "FirebaseJWTMiddlewareTests", dependencies: [ .target(name: "FirebaseJWTMiddleware"), diff --git a/Sources/FirebaseJWTMiddleware/Application+FirebaseJWT.swift b/Sources/FirebaseJWTMiddleware/Application+FirebaseJWT.swift index 50a7d90..a8c1cc6 100644 --- a/Sources/FirebaseJWTMiddleware/Application+FirebaseJWT.swift +++ b/Sources/FirebaseJWTMiddleware/Application+FirebaseJWT.swift @@ -7,6 +7,7 @@ import Vapor import JWT +import JWTKit extension Application { public var firebaseJwt: FirebaseJWT { @@ -16,11 +17,17 @@ extension Application { public struct FirebaseJWT { let application: Application - public func signers(on request: Request) -> EventLoopFuture { - self.jwks.get(on: request).flatMapThrowing { - let signers = JWTSigners() - try signers.use(jwks: $0) - return signers + public func signers(on request: Request) async throws -> JWTKeyCollection { + try await withCheckedThrowingContinuation { continuation in + self.jwks.get(on: request).flatMapThrowing { jwks in + // Assuming `add(jwks:)` is an async function + Task { + let collection = try await JWTKeyCollection().add(jwks: jwks) + continuation.resume(returning: collection) + } + }.whenFailure { error in + continuation.resume(throwing: error) + } } } diff --git a/Sources/FirebaseJWTMiddleware/FirebaseJWTMiddleware.swift b/Sources/FirebaseJWTMiddleware/FirebaseJWTMiddleware.swift index 761b6f7..ca8d257 100644 --- a/Sources/FirebaseJWTMiddleware/FirebaseJWTMiddleware.swift +++ b/Sources/FirebaseJWTMiddleware/FirebaseJWTMiddleware.swift @@ -5,7 +5,22 @@ open class FirebaseJWTMiddleware: Middleware { public init() {} + public func respond(to request: Request, chainingTo next: Responder) async throws -> FirebaseJWTPayload { + try await request.firebaseJwt.verify() + } + public func respond(to request: Request, chainingTo next: Responder) -> EventLoopFuture { - request.firebaseJwt.verify().transform(to: next.respond(to: request)) + let promise = request.eventLoop.makePromise(of: Response.self) + Task { + do { + let _ = try await request.firebaseJwt.verify() + // Wait for the future to complete and get the actual Response + let response = try await next.respond(to: request).get() + promise.succeed(response) + } catch { + promise.fail(error) + } + } + return promise.futureResult } } diff --git a/Sources/FirebaseJWTMiddleware/FirebaseJWTPayload.swift b/Sources/FirebaseJWTMiddleware/FirebaseJWTPayload.swift index 3a96969..556640e 100644 --- a/Sources/FirebaseJWTMiddleware/FirebaseJWTPayload.swift +++ b/Sources/FirebaseJWTMiddleware/FirebaseJWTPayload.swift @@ -6,8 +6,20 @@ // import JWT +import JWTKit +import Foundation public struct FirebaseJWTPayload: JWTPayload { + public func verify(using algorithm: any JWTKit.JWTAlgorithm) async throws { + guard issuer.value.contains("securetoken.google.com") else { + throw JWTError.claimVerificationFailure(failedClaim: IssuerClaim(value: issuer.value), reason: "Claim wasn't issued by Google") + } + guard subject.value.count <= 256 else { + throw JWTError.claimVerificationFailure(failedClaim: SubjectClaim(value: subject.value), reason: "Subject claim beyond 255 ASCII characters long.") + } + try expirationAt.verifyNotExpired() + } + enum CodingKeys: String, CodingKey { case issuer = "iss" case subject = "sub" @@ -47,16 +59,4 @@ public struct FirebaseJWTPayload: JWTPayload { public let name: String? public let isEmailVerified: Bool? public let phoneNumber: String? - - public func verify(using signer: JWTSigner) throws { - guard self.issuer.value.contains("securetoken.google.com") else { - throw JWTError.claimVerificationFailure(name: "iss", reason: "Claim wasn't issued by Google") - } - - guard self.subject.value.count <= 255 else { - throw JWTError.claimVerificationFailure(name: "sub", reason: "Subject claim beyond 255 ASCII characters long.") - } - - try self.expirationAt.verifyNotExpired() - } } diff --git a/Sources/FirebaseJWTMiddleware/Request+FirebaseJWT.swift b/Sources/FirebaseJWTMiddleware/Request+FirebaseJWT.swift index 2f321e3..ae26ba0 100644 --- a/Sources/FirebaseJWTMiddleware/Request+FirebaseJWT.swift +++ b/Sources/FirebaseJWTMiddleware/Request+FirebaseJWT.swift @@ -15,44 +15,26 @@ extension Request { public struct FirebaseJWT { let request: Request - public func verify( - applicationIdentifier: String? = nil - ) -> EventLoopFuture { + public func verify(applicationIdentifier: String? = nil) async throws -> FirebaseJWTPayload { guard let token = self.request.headers.bearerAuthorization?.token else { self.request.logger.error("Request is missing JWT bearer header.") - return self.request.eventLoop.makeFailedFuture(Abort(.unauthorized)) + throw Abort(.unauthorized) } - return self.verify( - token, - applicationIdentifier: applicationIdentifier - ) + return try await self.verify(token, applicationIdentifier: applicationIdentifier) } - public func verify( - _ message: String, - applicationIdentifier: String? = nil - ) -> EventLoopFuture { - self.verify( - [UInt8](message.utf8), - applicationIdentifier: applicationIdentifier - ) + + public func verify(_ message: String, applicationIdentifier: String? = nil ) async throws -> FirebaseJWTPayload { + try await self.verify([UInt8](message.utf8), applicationIdentifier: applicationIdentifier) } - public func verify( - _ message: Message, - applicationIdentifier: String? = nil - ) -> EventLoopFuture - where Message: DataProtocol - { - self.request.application.firebaseJwt.signers( - on: self.request - ).flatMapThrowing { signers in - let token = try signers.verify(message, as: FirebaseJWTPayload.self) - if let applicationIdentifier = applicationIdentifier ?? self.request.application.firebaseJwt.applicationIdentifier { - try token.audience.verifyIntendedAudience(includes: applicationIdentifier) - } - return token + public func verify(_ message: Message, applicationIdentifier: String? = nil) async throws -> FirebaseJWTPayload where Message: DataProtocol { + let signers = try await self.request.application.firebaseJwt.signers(on: self.request) + let token = try await signers.verify(message, as: FirebaseJWTPayload.self) + if let applicationIdentifier { + try token.audience.verifyIntendedAudience(includes: applicationIdentifier) } + return token } } }