Skip to content

Commit b904bc9

Browse files
committed
Updated GIDSignIn + GIDSignInInternalOptions Implementations + Unit Tests
1 parent 51868b3 commit b904bc9

File tree

6 files changed

+511
-32
lines changed

6 files changed

+511
-32
lines changed

GoogleSignIn/Sources/GIDSignIn.m

Lines changed: 150 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#import "GoogleSignIn/Sources/GIDCallbackQueue.h"
2929
#import "GoogleSignIn/Sources/GIDScopes.h"
3030
#import "GoogleSignIn/Sources/GIDSignInCallbackSchemes.h"
31+
#import "GoogleSignIn/Sources/GIDTokenClaimsInternalOptions.h"
3132
#if TARGET_OS_IOS && !TARGET_OS_MACCATALYST
3233
#import <AppCheckCore/GACAppCheckToken.h>
3334
#import "GoogleSignIn/Sources/GIDAppCheck/Implementations/GIDAppCheck.h"
@@ -136,6 +137,9 @@
136137
static NSString *const kLoginHintParameter = @"login_hint";
137138
static NSString *const kHostedDomainParameter = @"hd";
138139

140+
// Parameter for requesting the token claims.
141+
static NSString *const kTokenClaimsParameter = @"claims";
142+
139143
// Parameters for auth and token exchange endpoints using App Attest.
140144
static NSString *const kClientAssertionParameter = @"client_assertion";
141145
static NSString *const kClientAssertionTypeParameter = @"client_assertion_type";
@@ -169,6 +173,7 @@ @implementation GIDSignIn {
169173
// set when a sign-in flow is begun via |signInWithOptions:| when the options passed don't
170174
// represent a sign in continuation.
171175
GIDSignInInternalOptions *_currentOptions;
176+
GIDTokenClaimsInternalOptions *_tokenClaimsInternalOptions;
172177
#if TARGET_OS_IOS && !TARGET_OS_MACCATALYST
173178
GIDAppCheck *_appCheck API_AVAILABLE(ios(14));
174179
#endif // TARGET_OS_IOS && !TARGET_OS_MACCATALYST
@@ -284,14 +289,63 @@ - (void)signInWithPresentingViewController:(UIViewController *)presentingViewCon
284289
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
285290
nonce:(nullable NSString *)nonce
286291
completion:(nullable GIDSignInCompletion)completion {
292+
[self signInWithPresentingViewController:presentingViewController
293+
hint:hint
294+
additionalScopes:additionalScopes
295+
nonce:nonce
296+
tokenClaims:nil
297+
completion:completion];
298+
}
299+
300+
- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController
301+
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
302+
completion:(nullable GIDSignInCompletion)completion {
303+
[self signInWithPresentingViewController:presentingViewController
304+
hint:nil
305+
tokenClaims:tokenClaims
306+
completion:completion];
307+
}
308+
309+
- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController
310+
hint:(nullable NSString *)hint
311+
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
312+
completion:(nullable GIDSignInCompletion)completion {
313+
[self signInWithPresentingViewController:presentingViewController
314+
hint:hint
315+
additionalScopes:@[]
316+
tokenClaims:tokenClaims
317+
completion:completion];
318+
}
319+
320+
- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController
321+
hint:(nullable NSString *)hint
322+
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
323+
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
324+
completion:(nullable GIDSignInCompletion)completion {
325+
[self signInWithPresentingViewController:presentingViewController
326+
hint:hint
327+
additionalScopes:additionalScopes
328+
nonce:nil
329+
tokenClaims:tokenClaims
330+
completion:completion];
331+
}
332+
333+
334+
- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController
335+
hint:(nullable NSString *)hint
336+
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
337+
nonce:(nullable NSString *)nonce
338+
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
339+
completion:(nullable GIDSignInCompletion)completion {
287340
GIDSignInInternalOptions *options =
288-
[GIDSignInInternalOptions defaultOptionsWithConfiguration:_configuration
289-
presentingViewController:presentingViewController
290-
loginHint:hint
291-
addScopesFlow:NO
292-
scopes:additionalScopes
293-
nonce:nonce
294-
completion:completion];
341+
[GIDSignInInternalOptions defaultOptionsWithConfiguration:_configuration
342+
presentingViewController:presentingViewController
343+
loginHint:hint
344+
addScopesFlow:NO
345+
scopes:additionalScopes
346+
nonce:nonce
347+
tokenClaims:tokenClaims
348+
completion:completion];
295349
[self signInWithOptions:options];
296350
}
297351

@@ -375,14 +429,62 @@ - (void)signInWithPresentingWindow:(NSWindow *)presentingWindow
375429
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
376430
nonce:(nullable NSString *)nonce
377431
completion:(nullable GIDSignInCompletion)completion {
432+
[self signInWithPresentingWindow:presentingWindow
433+
hint:hint
434+
additionalScopes:additionalScopes
435+
nonce:nonce
436+
tokenClaims:nil
437+
completion:completion];
438+
}
439+
440+
- (void)signInWithPresentingWindow:(NSWindow *)presentingWindow
441+
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
442+
completion:(nullable GIDSignInCompletion)completion {
443+
[self signInWithPresentingWindow:presentingWindow
444+
hint:nil
445+
tokenClaims:tokenClaims
446+
completion:completion];
447+
}
448+
449+
- (void)signInWithPresentingWindow:(NSWindow *)presentingWindow
450+
hint:(nullable NSString *)hint
451+
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
452+
completion:(nullable GIDSignInCompletion)completion {
453+
[self signInWithPresentingWindow:presentingWindow
454+
hint:hint
455+
additionalScopes:@[]
456+
tokenClaims:tokenClaims
457+
completion:completion];
458+
}
459+
460+
- (void)signInWithPresentingWindow:(NSWindow *)presentingWindow
461+
hint:(nullable NSString *)hint
462+
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
463+
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
464+
completion:(nullable GIDSignInCompletion)completion {
465+
[self signInWithPresentingWindow:presentingWindow
466+
hint:hint
467+
additionalScopes:additionalScopes
468+
nonce:nil
469+
tokenClaims:tokenClaims
470+
completion:completion];
471+
}
472+
473+
- (void)signInWithPresentingWindow:(NSWindow *)presentingWindow
474+
hint:(nullable NSString *)hint
475+
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
476+
nonce:(nullable NSString *)nonce
477+
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
478+
completion:(nullable GIDSignInCompletion)completion {
378479
GIDSignInInternalOptions *options =
379-
[GIDSignInInternalOptions defaultOptionsWithConfiguration:_configuration
380-
presentingWindow:presentingWindow
381-
loginHint:hint
382-
addScopesFlow:NO
383-
scopes:additionalScopes
384-
nonce:nonce
385-
completion:completion];
480+
[GIDSignInInternalOptions defaultOptionsWithConfiguration:_configuration
481+
presentingWindow:presentingWindow
482+
loginHint:hint
483+
addScopesFlow:NO
484+
scopes:additionalScopes
485+
nonce:nonce
486+
tokenClaims:tokenClaims
487+
completion:completion];
386488
[self signInWithOptions:options];
387489
}
388490

@@ -542,6 +644,7 @@ - (instancetype)initWithKeychainStore:(GTMKeychainStore *)keychainStore
542644
self = [super init];
543645
if (self) {
544646
_keychainStore = keychainStore;
647+
_tokenClaimsInternalOptions = [[GIDTokenClaimsInternalOptions alloc] init];
545648

546649
// Get the bundle of the current executable.
547650
NSBundle *bundle = NSBundle.mainBundle;
@@ -636,6 +739,18 @@ - (void)signInWithOptions:(GIDSignInInternalOptions *)options {
636739
}
637740
}];
638741
} else {
742+
NSError *claimsError;
743+
744+
// If tokenClaims are invalid or JSON serialization fails, return with an error.
745+
if (![self processTokenClaimsForOptions:options error:&claimsError]) {
746+
if (options.completion) {
747+
self->_currentOptions = nil;
748+
dispatch_async(dispatch_get_main_queue(), ^{
749+
options.completion(nil, claimsError);
750+
});
751+
}
752+
return;
753+
}
639754
[self authenticateWithOptions:options];
640755
}
641756
}
@@ -765,6 +880,9 @@ - (void)authorizationRequestWithOptions:(GIDSignInInternalOptions *)options comp
765880
if (options.configuration.hostedDomain) {
766881
additionalParameters[kHostedDomainParameter] = options.configuration.hostedDomain;
767882
}
883+
if (options.tokenClaimsAsJSON) {
884+
additionalParameters[kTokenClaimsParameter] = options.tokenClaimsAsJSON;
885+
}
768886

769887
#if TARGET_OS_IOS && !TARGET_OS_MACCATALYST
770888
[additionalParameters addEntriesFromDictionary:
@@ -1149,6 +1267,24 @@ - (void)assertValidPresentingViewController {
11491267
}
11501268
}
11511269

1270+
- (BOOL)processTokenClaimsForOptions:(GIDSignInInternalOptions *)options
1271+
error:(NSError **)error {
1272+
if (!options.tokenClaims) {
1273+
return YES; // Success
1274+
}
1275+
1276+
NSString *tokenClaimsAsJSON =
1277+
[_tokenClaimsInternalOptions validatedJSONStringForClaims:options.tokenClaims
1278+
error:error];
1279+
1280+
if (!tokenClaimsAsJSON) {
1281+
return NO; // Failure
1282+
}
1283+
1284+
options.tokenClaimsAsJSON = tokenClaimsAsJSON;
1285+
return YES; // Success
1286+
}
1287+
11521288
// Checks whether or not this is the first time the app runs.
11531289
- (BOOL)isFreshInstall {
11541290
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

GoogleSignIn/Sources/GIDSignInInternalOptions.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ NS_ASSUME_NONNULL_BEGIN
6868
/// and to mitigate replay attacks.
6969
@property(nonatomic, readonly, copy, nullable) NSString *nonce;
7070

71+
/// The tokenClaims requested by the Clients.
72+
@property(nonatomic, readonly, copy, nullable) NSSet<GIDTokenClaim *> *tokenClaims;
73+
74+
/// The JSON token claims to be used during the flow.
75+
@property(nonatomic, copy, nullable) NSString *tokenClaimsAsJSON;
76+
7177
/// Creates the default options.
7278
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
7379
+ (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)configuration
@@ -82,6 +88,7 @@ NS_ASSUME_NONNULL_BEGIN
8288
addScopesFlow:(BOOL)addScopesFlow
8389
scopes:(nullable NSArray *)scopes
8490
nonce:(nullable NSString *)nonce
91+
tokenClaims:(nullable NSSet *)tokenClaims
8592
completion:(nullable GIDSignInCompletion)completion;
8693

8794
#elif TARGET_OS_OSX
@@ -97,6 +104,7 @@ NS_ASSUME_NONNULL_BEGIN
97104
addScopesFlow:(BOOL)addScopesFlow
98105
scopes:(nullable NSArray *)scopes
99106
nonce:(nullable NSString *)nonce
107+
tokenClaims:(nullable NSSet *)tokenClaims
100108
completion:(nullable GIDSignInCompletion)completion;
101109
#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST
102110

GoogleSignIn/Sources/GIDSignInInternalOptions.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ + (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)con
3232
addScopesFlow:(BOOL)addScopesFlow
3333
scopes:(nullable NSArray *)scopes
3434
nonce:(nullable NSString *)nonce
35+
tokenClaims:(nullable NSSet *)tokenClaims
3536
completion:(nullable GIDSignInCompletion)completion {
3637
#elif TARGET_OS_OSX
3738
+ (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)configuration
@@ -57,6 +58,7 @@ + (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)con
5758
options->_completion = completion;
5859
options->_scopes = [GIDScopes scopesWithBasicProfile:scopes];
5960
options->_nonce = nonce;
61+
options->_tokenClaims = tokenClaims;
6062
}
6163
return options;
6264
}
@@ -84,6 +86,7 @@ + (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)con
8486
addScopesFlow:addScopesFlow
8587
scopes:@[]
8688
nonce:nil
89+
tokenClaims:nil
8790
completion:completion];
8891
return options;
8992
}
@@ -120,6 +123,7 @@ - (instancetype)optionsWithExtraParameters:(NSDictionary *)extraParams
120123
options->_loginHint = _loginHint;
121124
options->_completion = _completion;
122125
options->_scopes = _scopes;
126+
options->_tokenClaims = _tokenClaims;
123127
options->_extraParams = [extraParams copy];
124128
}
125129
return options;

0 commit comments

Comments
 (0)