feat: Only log local debug tokens when not yet registered (#95)

Co-authored-by: Nick Cooke <nickcooke@google.com>
This commit is contained in:
Andrew HeardandNick Cooke authored and GitHub committed 2026-06-10 11:30:20 -04:00
1 parent f6b4582ed1
commit bb4002485f
4 files changed
+187 -15

No files matched your search

@@ -36,18 +36,34 @@ static NSString *const kDebugTokenEnvKey = @"AppCheckDebugToken";
static NSString *const kFirebaseDebugTokenEnvKey = @"FIRAAppCheckDebugToken";
static NSString *const kDebugTokenUserDefaultsKey = @"GACAppCheckDebugToken";
// The base key for registration status.
// NOTE: Do not use this key directly. Use `registeredUserDefaultsKeyForServiceName:resourceName:`
// to obtain the namespaced key.
static NSString *const kDebugTokenRegisteredUserDefaultsKey = @"GACAppCheckDebugTokenRegistered";
@interface GACAppCheckDebugProvider ()
@property(nonatomic, readonly) id<GACAppCheckDebugProviderAPIServiceProtocol> APIService;
@property(nonatomic, readonly, nullable, copy) NSString *debugTokenEnvValue;
@property(nonatomic, readonly, copy) NSString *registeredUserDefaultsKey;
+ (NSString *)registeredUserDefaultsKeyForServiceName:(NSString *)serviceName
resourceName:(NSString *)resourceName;
@end
static NSString *_Nullable EnvironmentVariableDebugToken(NSString *registeredUserDefaultsKey);
@implementation GACAppCheckDebugProvider
- (instancetype)initWithAPIService:(id<GACAppCheckDebugProviderAPIServiceProtocol>)APIService {
- (instancetype)initWithAPIService:(id<GACAppCheckDebugProviderAPIServiceProtocol>)APIService
serviceName:(NSString *)serviceName
resourceName:(NSString *)resourceName {
self = [super init];
if (self) {
_APIService = APIService;
_debugTokenEnvValue = EnvironmentVariableDebugToken();
_registeredUserDefaultsKey =
[[[self class] registeredUserDefaultsKeyForServiceName:serviceName
resourceName:resourceName] copy];
_debugTokenEnvValue = EnvironmentVariableDebugToken(_registeredUserDefaultsKey);
}
return self;
}
@@ -70,7 +86,9 @@ static NSString *const kDebugTokenUserDefaultsKey = @"GACAppCheckDebugToken";
[[GACAppCheckDebugProviderAPIService alloc] initWithAPIService:APIService
resourceName:resourceName];
return [self initWithAPIService:debugAPIService];
return [self initWithAPIService:debugAPIService
serviceName:serviceName
resourceName:resourceName];
}
- (NSString *)currentDebugToken {
@@ -108,6 +126,7 @@ static NSString *const kDebugTokenUserDefaultsKey = @"GACAppCheckDebugToken";
return [self.APIService appCheckTokenWithDebugToken:debugToken limitedUse:limitedUse];
})
.then(^id(GACAppCheckToken *appCheckToken) {
[[GULUserDefaults standardUserDefaults] setBool:YES forKey:self.registeredUserDefaultsKey];
handler(appCheckToken, nil);
return nil;
})
@@ -115,6 +134,10 @@ static NSString *const kDebugTokenUserDefaultsKey = @"GACAppCheckDebugToken";
NSString *logMessage = [NSString
stringWithFormat:@"Failed to exchange debug token to app check token: %@", error];
GACAppCheckLogDebug(GACLoggerAppCheckMessageDebugProviderFailedExchange, logMessage);
if (error.code != GACAppCheckErrorCodeServerUnreachable) {
[[GULUserDefaults standardUserDefaults]
removeObjectForKey:self.registeredUserDefaultsKey];
}
handler(nil, error);
});
}
@@ -133,7 +156,19 @@ static NSString *GenerateAndStoreDebugToken(void) {
return token;
}
static NSString *_Nullable EnvironmentVariableDebugToken(void) {
+ (NSString *)registeredUserDefaultsKeyForServiceName:(NSString *)serviceName
resourceName:(NSString *)resourceName {
NSString *safeServiceName = serviceName.length > 0 ? serviceName : @"default";
NSString *safeResourceName = [resourceName stringByReplacingOccurrencesOfString:@"/"
withString:@"_"];
if (safeResourceName.length == 0) {
safeResourceName = @"default";
}
return [NSString stringWithFormat:@"%@_%@_%@", kDebugTokenRegisteredUserDefaultsKey,
safeServiceName, safeResourceName];
}
static NSString *_Nullable EnvironmentVariableDebugToken(NSString *registeredUserDefaultsKey) {
NSDictionary<NSString *, NSString *> *environment = [[NSProcessInfo processInfo] environment];
NSString *envVariableValue = environment[kDebugTokenEnvKey];
NSString *firebaseEnvVariableValue = environment[kFirebaseDebugTokenEnvKey];
@@ -175,9 +210,14 @@ static NSString *_Nullable EnvironmentVariableDebugToken(void) {
return firebaseEnvVariableValue;
} else {
// Print only a locally generated token to avoid a valid token leak on CI.
GACAppCheckLog(GACLoggerAppCheckMessageLocalDebugToken, GACAppCheckLogLevelWarning,
[NSString stringWithFormat:@"App Check debug token: '%@'.", LocalDebugToken()]);
BOOL isRegistered =
[[GULUserDefaults standardUserDefaults] boolForKey:registeredUserDefaultsKey];
if (!isRegistered) {
// Print only a locally generated token to avoid a valid token leak on CI.
GACAppCheckLog(
GACLoggerAppCheckMessageLocalDebugToken, GACAppCheckLogLevelWarning,
[NSString stringWithFormat:@"App Check debug token: '%@'.", LocalDebugToken()]);
}
return nil;
}