Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
149 changes: 135 additions & 14 deletions GoogleSignIn/Sources/GIDSignIn.m
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#import "GoogleSignIn/Sources/GIDCallbackQueue.h"
#import "GoogleSignIn/Sources/GIDScopes.h"
#import "GoogleSignIn/Sources/GIDSignInCallbackSchemes.h"
#import "GoogleSignIn/Sources/GIDTokenClaimsInternalOptions.h"
#if TARGET_OS_IOS && !TARGET_OS_MACCATALYST
#import <AppCheckCore/GACAppCheckToken.h>
#import "GoogleSignIn/Sources/GIDAppCheck/Implementations/GIDAppCheck.h"
Expand Down Expand Up @@ -136,6 +137,9 @@
static NSString *const kLoginHintParameter = @"login_hint";
static NSString *const kHostedDomainParameter = @"hd";

// Parameter for requesting the token claims.
static NSString *const kTokenClaimsParameter = @"claims";

// Parameters for auth and token exchange endpoints using App Attest.
static NSString *const kClientAssertionParameter = @"client_assertion";
static NSString *const kClientAssertionTypeParameter = @"client_assertion_type";
Expand Down Expand Up @@ -169,6 +173,7 @@ @implementation GIDSignIn {
// set when a sign-in flow is begun via |signInWithOptions:| when the options passed don't
// represent a sign in continuation.
GIDSignInInternalOptions *_currentOptions;
GIDTokenClaimsInternalOptions *_tokenClaimsInternalOptions;
#if TARGET_OS_IOS && !TARGET_OS_MACCATALYST
GIDAppCheck *_appCheck API_AVAILABLE(ios(14));
#endif // TARGET_OS_IOS && !TARGET_OS_MACCATALYST
Expand Down Expand Up @@ -284,14 +289,63 @@ - (void)signInWithPresentingViewController:(UIViewController *)presentingViewCon
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
nonce:(nullable NSString *)nonce
completion:(nullable GIDSignInCompletion)completion {
[self signInWithPresentingViewController:presentingViewController
hint:hint
additionalScopes:additionalScopes
nonce:nonce
tokenClaims:nil
completion:completion];
}

- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
completion:(nullable GIDSignInCompletion)completion {
[self signInWithPresentingViewController:presentingViewController
hint:nil
tokenClaims:tokenClaims
completion:completion];
}

- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController
hint:(nullable NSString *)hint
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
completion:(nullable GIDSignInCompletion)completion {
[self signInWithPresentingViewController:presentingViewController
hint:hint
additionalScopes:@[]
tokenClaims:tokenClaims
completion:completion];
}

- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController
hint:(nullable NSString *)hint
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
completion:(nullable GIDSignInCompletion)completion {
[self signInWithPresentingViewController:presentingViewController
hint:hint
additionalScopes:additionalScopes
nonce:nil
tokenClaims:tokenClaims
completion:completion];
}


- (void)signInWithPresentingViewController:(UIViewController *)presentingViewController
hint:(nullable NSString *)hint
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
nonce:(nullable NSString *)nonce
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
completion:(nullable GIDSignInCompletion)completion {
GIDSignInInternalOptions *options =
[GIDSignInInternalOptions defaultOptionsWithConfiguration:_configuration
presentingViewController:presentingViewController
loginHint:hint
addScopesFlow:NO
scopes:additionalScopes
nonce:nonce
completion:completion];
[GIDSignInInternalOptions defaultOptionsWithConfiguration:_configuration
presentingViewController:presentingViewController
loginHint:hint
addScopesFlow:NO
scopes:additionalScopes
nonce:nonce
tokenClaims:tokenClaims
completion:completion];
[self signInWithOptions:options];
}

Expand Down Expand Up @@ -375,14 +429,62 @@ - (void)signInWithPresentingWindow:(NSWindow *)presentingWindow
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
nonce:(nullable NSString *)nonce
completion:(nullable GIDSignInCompletion)completion {
[self signInWithPresentingWindow:presentingWindow
hint:hint
additionalScopes:additionalScopes
nonce:nonce
tokenClaims:nil
completion:completion];
}

- (void)signInWithPresentingWindow:(NSWindow *)presentingWindow
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
completion:(nullable GIDSignInCompletion)completion {
[self signInWithPresentingWindow:presentingWindow
hint:nil
tokenClaims:tokenClaims
completion:completion];
}

- (void)signInWithPresentingWindow:(NSWindow *)presentingWindow
hint:(nullable NSString *)hint
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
completion:(nullable GIDSignInCompletion)completion {
[self signInWithPresentingWindow:presentingWindow
hint:hint
additionalScopes:@[]
tokenClaims:tokenClaims
completion:completion];
}

- (void)signInWithPresentingWindow:(NSWindow *)presentingWindow
hint:(nullable NSString *)hint
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
completion:(nullable GIDSignInCompletion)completion {
[self signInWithPresentingWindow:presentingWindow
hint:hint
additionalScopes:additionalScopes
nonce:nil
tokenClaims:tokenClaims
completion:completion];
}

- (void)signInWithPresentingWindow:(NSWindow *)presentingWindow
hint:(nullable NSString *)hint
additionalScopes:(nullable NSArray<NSString *> *)additionalScopes
nonce:(nullable NSString *)nonce
tokenClaims:(nullable NSSet<GIDTokenClaim *> *)tokenClaims
completion:(nullable GIDSignInCompletion)completion {
GIDSignInInternalOptions *options =
[GIDSignInInternalOptions defaultOptionsWithConfiguration:_configuration
presentingWindow:presentingWindow
loginHint:hint
addScopesFlow:NO
scopes:additionalScopes
nonce:nonce
completion:completion];
[GIDSignInInternalOptions defaultOptionsWithConfiguration:_configuration
presentingWindow:presentingWindow
loginHint:hint
addScopesFlow:NO
scopes:additionalScopes
nonce:nonce
tokenClaims:tokenClaims
completion:completion];
[self signInWithOptions:options];
}

Expand Down Expand Up @@ -542,6 +644,7 @@ - (instancetype)initWithKeychainStore:(GTMKeychainStore *)keychainStore
self = [super init];
if (self) {
_keychainStore = keychainStore;
_tokenClaimsInternalOptions = [[GIDTokenClaimsInternalOptions alloc] init];

// Get the bundle of the current executable.
NSBundle *bundle = NSBundle.mainBundle;
Expand Down Expand Up @@ -636,6 +739,21 @@ - (void)signInWithOptions:(GIDSignInInternalOptions *)options {
}
}];
} else {
NSError *claimsError;

// If tokenClaims are invalid or JSON serialization fails, return with an error.
options.tokenClaimsAsJSON = [_tokenClaimsInternalOptions
validatedJSONStringForClaims:options.tokenClaims
error:&claimsError];
if (claimsError) {
if (options.completion) {
self->_currentOptions = nil;
dispatch_async(dispatch_get_main_queue(), ^{
options.completion(nil, claimsError);
});
}
return;
}
[self authenticateWithOptions:options];
}
}
Expand Down Expand Up @@ -765,6 +883,9 @@ - (void)authorizationRequestWithOptions:(GIDSignInInternalOptions *)options comp
if (options.configuration.hostedDomain) {
additionalParameters[kHostedDomainParameter] = options.configuration.hostedDomain;
}
if (options.tokenClaimsAsJSON) {
additionalParameters[kTokenClaimsParameter] = options.tokenClaimsAsJSON;
}

#if TARGET_OS_IOS && !TARGET_OS_MACCATALYST
[additionalParameters addEntriesFromDictionary:
Expand Down
8 changes: 8 additions & 0 deletions GoogleSignIn/Sources/GIDSignInInternalOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@ NS_ASSUME_NONNULL_BEGIN
/// and to mitigate replay attacks.
@property(nonatomic, readonly, copy, nullable) NSString *nonce;

/// The tokenClaims requested by the Clients.
@property(nonatomic, readonly, copy, nullable) NSSet<GIDTokenClaim *> *tokenClaims;

/// The JSON token claims to be used during the flow.
@property(nonatomic, copy, nullable) NSString *tokenClaimsAsJSON;

/// Creates the default options.
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
+ (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)configuration
Expand All @@ -82,6 +88,7 @@ NS_ASSUME_NONNULL_BEGIN
addScopesFlow:(BOOL)addScopesFlow
scopes:(nullable NSArray *)scopes
nonce:(nullable NSString *)nonce
tokenClaims:(nullable NSSet *)tokenClaims
completion:(nullable GIDSignInCompletion)completion;

#elif TARGET_OS_OSX
Expand All @@ -97,6 +104,7 @@ NS_ASSUME_NONNULL_BEGIN
addScopesFlow:(BOOL)addScopesFlow
scopes:(nullable NSArray *)scopes
nonce:(nullable NSString *)nonce
tokenClaims:(nullable NSSet *)tokenClaims
completion:(nullable GIDSignInCompletion)completion;
#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST

Expand Down
5 changes: 5 additions & 0 deletions GoogleSignIn/Sources/GIDSignInInternalOptions.m
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ + (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)con
addScopesFlow:(BOOL)addScopesFlow
scopes:(nullable NSArray *)scopes
nonce:(nullable NSString *)nonce
tokenClaims:(nullable NSSet *)tokenClaims
completion:(nullable GIDSignInCompletion)completion {
#elif TARGET_OS_OSX
+ (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)configuration
Expand All @@ -40,6 +41,7 @@ + (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)con
addScopesFlow:(BOOL)addScopesFlow
scopes:(nullable NSArray *)scopes
nonce:(nullable NSString *)nonce
tokenClaims:(nullable NSSet *)tokenClaims
completion:(nullable GIDSignInCompletion)completion {
#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST
GIDSignInInternalOptions *options = [[GIDSignInInternalOptions alloc] init];
Expand All @@ -57,6 +59,7 @@ + (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)con
options->_completion = completion;
options->_scopes = [GIDScopes scopesWithBasicProfile:scopes];
options->_nonce = nonce;
options->_tokenClaims = tokenClaims;
}
return options;
}
Expand Down Expand Up @@ -84,6 +87,7 @@ + (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)con
addScopesFlow:addScopesFlow
scopes:@[]
nonce:nil
tokenClaims:nil
completion:completion];
return options;
}
Expand Down Expand Up @@ -120,6 +124,7 @@ - (instancetype)optionsWithExtraParameters:(NSDictionary *)extraParams
options->_loginHint = _loginHint;
options->_completion = _completion;
options->_scopes = _scopes;
options->_tokenClaims = _tokenClaims;
options->_extraParams = [extraParams copy];
}
return options;
Expand Down
Loading