Skip to content

Commit bb8df26

Browse files
aiwenisevanncooke3
authored andcommitted
draft pr for callable functions
1 parent 34932ce commit bb8df26

File tree

7 files changed

+165
-78
lines changed

7 files changed

+165
-78
lines changed

FirebaseAppCheck/Interop/FIRAppCheckInterop.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ NS_SWIFT_NAME(AppCheckInterop) @protocol FIRAppCheckInterop
3131
completion:(FIRAppCheckTokenHandlerInterop)handler
3232
NS_SWIFT_NAME(getToken(forcingRefresh:completion:));
3333

34+
/// Retrieve a new limited-use Firebase App Check token
35+
- (void)getLimitedUseTokenWithCompletion:(FIRAppCheckTokenHandlerInterop)handler
36+
NS_SWIFT_NAME(getLimitedUseToken(completion:));
37+
3438
/// A notification with the specified name is sent to the default notification center
3539
/// (`NotificationCenter.default`) each time a Firebase app check token is refreshed.
3640
/// The user info dictionary contains `-[self notificationTokenKey]` and

FirebaseAppCheck/Sources/Core/FIRAppCheck.m

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,21 @@ - (void)getTokenForcingRefresh:(BOOL)forcingRefresh
234234
});
235235
}
236236

237+
- (void)getLimitedUseTokenWithCompletion:(FIRAppCheckTokenHandlerInterop)handler {
238+
[self retrieveLimitedUseToken]
239+
.then(^id _Nullable(FIRAppCheckToken *token) {
240+
FIRAppCheckTokenResult *result = [[FIRAppCheckTokenResult alloc] initWithToken:token.token
241+
error:nil];
242+
handler(result);
243+
return result;
244+
})
245+
.catch(^(NSError *_Nonnull error) {
246+
FIRAppCheckTokenResult *result =
247+
[[FIRAppCheckTokenResult alloc] initWithToken:kDummyFACTokenValue error:error];
248+
handler(result);
249+
});
250+
}
251+
237252
- (nonnull NSString *)tokenDidChangeNotificationName {
238253
return FIRAppCheckAppCheckTokenDidChangeNotification;
239254
}

FirebaseFunctions/Sources/Functions.swift

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ internal enum FunctionsConstants {
5959
/// The region to use for all function references.
6060
internal let region: String
6161

62+
/// The boolean to decide if getLimitedUseToken() is generated
63+
internal var useLimitedUseAppCheckToken: Bool = false
64+
6265
// MARK: - Public APIs
6366

6467
/**
@@ -139,11 +142,19 @@ internal enum FunctionsConstants {
139142
* Creates a reference to the Callable HTTPS trigger with the given name.
140143
* - Parameter name The name of the Callable HTTPS trigger.
141144
*/
142-
@objc(HTTPSCallableWithName:) open func httpsCallable(_ name: String) -> HTTPSCallable {
145+
@objc(HTTPSCallableWithName:useLimitedUseAppCheckToken:) open func httpsCallable(_ name: String,
146+
useLimitedUseAppCheckToken: Bool =
147+
false)
148+
-> HTTPSCallable {
149+
self.useLimitedUseAppCheckToken = useLimitedUseAppCheckToken
143150
return HTTPSCallable(functions: self, name: name)
144151
}
145152

146-
@objc(HTTPSCallableWithURL:) open func httpsCallable(_ url: URL) -> HTTPSCallable {
153+
@objc(HTTPSCallableWithURL:useLimitedUseAppCheckToken:) open func httpsCallable(_ url: URL,
154+
useLimitedUseAppCheckToken: Bool =
155+
false)
156+
-> HTTPSCallable {
157+
self.useLimitedUseAppCheckToken = useLimitedUseAppCheckToken
147158
return HTTPSCallable(functions: self, url: url)
148159
}
149160

@@ -157,14 +168,19 @@ internal enum FunctionsConstants {
157168
/// - Returns: A reference to an HTTPS-callable Cloud Function that can be used to make Cloud Functions invocations.
158169
open func httpsCallable<Request: Encodable,
159170
Response: Decodable>(_ name: String,
171+
useLimitedUseAppCheckToken: Bool,
160172
requestAs: Request.Type = Request.self,
161173
responseAs: Response.Type = Response.self,
162174
encoder: FirebaseDataEncoder = FirebaseDataEncoder(
163175
),
164176
decoder: FirebaseDataDecoder = FirebaseDataDecoder(
165177
))
166178
-> Callable<Request, Response> {
167-
return Callable(callable: httpsCallable(name), encoder: encoder, decoder: decoder)
179+
return Callable(
180+
callable: httpsCallable(name, useLimitedUseAppCheckToken: useLimitedUseAppCheckToken),
181+
encoder: encoder,
182+
decoder: decoder
183+
)
168184
}
169185

170186
/// Creates a reference to the Callable HTTPS trigger with the given name, the type of an `Encodable`
@@ -177,14 +193,19 @@ internal enum FunctionsConstants {
177193
/// - Returns: A reference to an HTTPS-callable Cloud Function that can be used to make Cloud Functions invocations.
178194
open func httpsCallable<Request: Encodable,
179195
Response: Decodable>(_ url: URL,
196+
useLimitedUseAppCheckToken: Bool,
180197
requestAs: Request.Type = Request.self,
181198
responseAs: Response.Type = Response.self,
182199
encoder: FirebaseDataEncoder = FirebaseDataEncoder(
183200
),
184201
decoder: FirebaseDataDecoder = FirebaseDataDecoder(
185202
))
186203
-> Callable<Request, Response> {
187-
return Callable(callable: httpsCallable(url), encoder: encoder, decoder: decoder)
204+
return Callable(
205+
callable: httpsCallable(url, useLimitedUseAppCheckToken: useLimitedUseAppCheckToken),
206+
encoder: encoder,
207+
decoder: decoder
208+
)
188209
}
189210

190211
/**
@@ -353,8 +374,20 @@ internal enum FunctionsConstants {
353374
fetcher.setRequestValue(fcmToken, forHTTPHeaderField: Constants.fcmTokenHeader)
354375
}
355376

356-
if let appCheckToken = context.appCheckToken {
357-
fetcher.setRequestValue(appCheckToken, forHTTPHeaderField: Constants.appCheckTokenHeader)
377+
if useLimitedUseAppCheckToken == true {
378+
if let appCheckToken = context.limitedUseAppCheckToken {
379+
fetcher.setRequestValue(
380+
appCheckToken,
381+
forHTTPHeaderField: Constants.appCheckTokenHeader
382+
)
383+
}
384+
} else {
385+
if let appCheckToken = context.appCheckToken {
386+
fetcher.setRequestValue(
387+
appCheckToken,
388+
forHTTPHeaderField: Constants.appCheckTokenHeader
389+
)
390+
}
358391
}
359392

360393
// Override normal security rules if this is a local test.

FirebaseFunctions/Sources/Internal/FunctionsContext.swift

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@ internal class FunctionsContext: NSObject {
2222
let authToken: String?
2323
let fcmToken: String?
2424
let appCheckToken: String?
25+
let limitedUseAppCheckToken: String?
2526

26-
init(authToken: String?, fcmToken: String?, appCheckToken: String?) {
27+
init(authToken: String?, fcmToken: String?, appCheckToken: String?,
28+
limitedUseAppCheckToken: String?) {
2729
self.authToken = authToken
2830
self.fcmToken = fcmToken
2931
self.appCheckToken = appCheckToken
32+
self.limitedUseAppCheckToken = limitedUseAppCheckToken
3033
}
3134
}
3235

@@ -54,6 +57,7 @@ internal class FunctionsContextProvider: NSObject {
5457
var authToken: String?
5558
var appCheckToken: String?
5659
var error: Error?
60+
var limitedUseAppCheckToken: String?
5761

5862
if let auth = auth {
5963
dispatchGroup.enter()
@@ -77,10 +81,23 @@ internal class FunctionsContextProvider: NSObject {
7781
}
7882
}
7983

84+
if let appCheck = appCheck {
85+
dispatchGroup.enter()
86+
87+
appCheck.getLimitedUseToken { tokenResult in
88+
// Send only valid token to functions.
89+
if tokenResult.error == nil {
90+
appCheckToken = tokenResult.token
91+
}
92+
dispatchGroup.leave()
93+
}
94+
}
95+
8096
dispatchGroup.notify(queue: .main) {
8197
let context = FunctionsContext(authToken: authToken,
8298
fcmToken: self.messaging?.fcmToken,
83-
appCheckToken: appCheckToken)
99+
appCheckToken: appCheckToken,
100+
limitedUseAppCheckToken: limitedUseAppCheckToken)
84101
completion(context, error)
85102
}
86103
}

0 commit comments

Comments
 (0)