From 0d8c0dac2b6382531bd61b001eb04fa72405d3a4 Mon Sep 17 00:00:00 2001 From: Austin Feight Date: Fri, 5 Nov 2021 18:08:56 -0400 Subject: [PATCH] allow requesting additional scopes during sign in --- CHANGELOG.md | 4 ++ GoogleSignIn.podspec | 2 +- GoogleSignIn/Sources/GIDSignIn.m | 36 +++++++++++++--- .../Sources/GIDSignInInternalOptions.h | 8 ++++ .../Sources/GIDSignInInternalOptions.m | 15 ++++++- .../Sources/Public/GoogleSignIn/GIDSignIn.h | 41 +++++++++++++++++++ Package.swift | 2 +- 7 files changed, 99 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 159bddb7..eeb12e06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 6.0.3 (2021-11-5) +- Allow for additional scopes to be requested at sign in + ([#2](https://github.com/elliottech/GoogleSignIn-iOS/pull/2)) + # 6.0.2 (2021-8-20) - Ensure that module imports can be used when built as a library. ([#53](https://github.com/google/GoogleSignIn-iOS/pull/53)) diff --git a/GoogleSignIn.podspec b/GoogleSignIn.podspec index b157e94e..7e676f0b 100644 --- a/GoogleSignIn.podspec +++ b/GoogleSignIn.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'GoogleSignIn' - s.version = '6.0.2' + s.version = '6.0.3' s.summary = 'Enables iOS apps to sign in with Google.' s.description = <<-DESC The Google Sign-In SDK allows users to sign in with their Google account from third-party apps. diff --git a/GoogleSignIn/Sources/GIDSignIn.m b/GoogleSignIn/Sources/GIDSignIn.m index d39a4506..f0052b61 100644 --- a/GoogleSignIn/Sources/GIDSignIn.m +++ b/GoogleSignIn/Sources/GIDSignIn.m @@ -201,27 +201,51 @@ - (BOOL)restorePreviousSignInNoRefresh { return YES; } +- (void)signInWithConfiguration:(GIDConfiguration *)configuration + presentingViewController:(UIViewController *)presentingViewController + callback:(nullable GIDSignInCallback)callback { + [self signInWithConfiguration:configuration + presentingViewController:presentingViewController + hint:nil + callback:callback]; +} + - (void)signInWithConfiguration:(GIDConfiguration *)configuration presentingViewController:(UIViewController *)presentingViewController hint:(nullable NSString *)hint callback:(nullable GIDSignInCallback)callback { - GIDSignInInternalOptions *options = - [GIDSignInInternalOptions defaultOptionsWithConfiguration:configuration - presentingViewController:presentingViewController - loginHint:hint - callback:callback]; - [self signInWithOptions:options]; + [self signInWithConfiguration:configuration + additionalScopes:@[] + presentingViewController:presentingViewController + hint:hint + callback:callback]; } - (void)signInWithConfiguration:(GIDConfiguration *)configuration + additionalScopes:(NSArray *)additionalScopes presentingViewController:(UIViewController *)presentingViewController callback:(nullable GIDSignInCallback)callback { [self signInWithConfiguration:configuration + additionalScopes:additionalScopes presentingViewController:presentingViewController hint:nil callback:callback]; } +- (void)signInWithConfiguration:(GIDConfiguration *)configuration + additionalScopes:(NSArray *)additionalScopes + presentingViewController:(UIViewController *)presentingViewController + hint:(nullable NSString *)hint + callback:(nullable GIDSignInCallback)callback { + GIDSignInInternalOptions *options = + [GIDSignInInternalOptions defaultOptionsWithConfiguration:configuration + additionalScopes:additionalScopes + presentingViewController:presentingViewController + loginHint:hint + callback:callback]; + [self signInWithOptions:options]; +} + - (void)addScopes:(NSArray *)scopes presentingViewController:(UIViewController *)presentingViewController callback:(nullable GIDSignInCallback)callback { diff --git a/GoogleSignIn/Sources/GIDSignInInternalOptions.h b/GoogleSignIn/Sources/GIDSignInInternalOptions.h index b6ab06e1..22e1761f 100644 --- a/GoogleSignIn/Sources/GIDSignInInternalOptions.h +++ b/GoogleSignIn/Sources/GIDSignInInternalOptions.h @@ -56,6 +56,14 @@ NS_ASSUME_NONNULL_BEGIN loginHint:(nullable NSString *)loginHint callback:(GIDSignInCallback)callback; +/// Creates the default options, with the ability to add additional scopes. ++ (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)configuration + additionalScopes:(NSArray *)additionalScopes + presentingViewController: + (nullable UIViewController *)presentingViewController + loginHint:(nullable NSString *)loginHint + callback:(GIDSignInCallback)callback; + /// Creates the options to sign in silently. + (instancetype)silentOptionsWithCallback:(GIDSignInCallback)callback; diff --git a/GoogleSignIn/Sources/GIDSignInInternalOptions.m b/GoogleSignIn/Sources/GIDSignInInternalOptions.m index 8a26e9c4..18fb2a3e 100644 --- a/GoogleSignIn/Sources/GIDSignInInternalOptions.m +++ b/GoogleSignIn/Sources/GIDSignInInternalOptions.m @@ -25,6 +25,19 @@ + (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)con (nullable UIViewController *)presentingViewController loginHint:(nullable NSString *)loginHint callback:(GIDSignInCallback)callback { + return [self defaultOptionsWithConfiguration:configuration + additionalScopes:@[] + presentingViewController:presentingViewController + loginHint:loginHint + callback:callback]; +} + ++ (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)configuration + additionalScopes:(NSArray *)additionalScopes + presentingViewController: + (nullable UIViewController *)presentingViewController + loginHint:(nullable NSString *)loginHint + callback:(GIDSignInCallback)callback { GIDSignInInternalOptions *options = [[GIDSignInInternalOptions alloc] init]; if (options) { options->_interactive = YES; @@ -33,7 +46,7 @@ + (instancetype)defaultOptionsWithConfiguration:(nullable GIDConfiguration *)con options->_presentingViewController = presentingViewController; options->_loginHint = loginHint; options->_callback = callback; - options->_scopes = [GIDScopes scopesWithBasicProfile:@[]]; + options->_scopes = [GIDScopes scopesWithBasicProfile:additionalScopes]; } return options; } diff --git a/GoogleSignIn/Sources/Public/GoogleSignIn/GIDSignIn.h b/GoogleSignIn/Sources/Public/GoogleSignIn/GIDSignIn.h index 02193aa8..681e3448 100644 --- a/GoogleSignIn/Sources/Public/GoogleSignIn/GIDSignIn.h +++ b/GoogleSignIn/Sources/Public/GoogleSignIn/GIDSignIn.h @@ -126,6 +126,47 @@ typedef void (^GIDDisconnectCallback)(NSError *_Nullable error); hint:(nullable NSString *)hint callback:(nullable GIDSignInCallback)callback; +/// Starts an interactive sign-in flow using the provided configuration and a login hint. +/// +/// The callback will be called at the end of this process. Any saved sign-in state will be +/// replaced by the result of this flow. Note that this method should not be called when the app is +/// starting up, (e.g in `application:didFinishLaunchingWithOptions:`); instead use the +/// `restorePreviousSignInWithCallback:` method to restore a previous sign-in. +/// +/// @param configuration The configuration properties to be used for this flow. +/// @param additionalScopes Additional scopes to request +/// @param presentingViewController The view controller used to present `SFSafariViewContoller` on +/// iOS 9 and 10 and to supply `presentationContextProvider` for `ASWebAuthenticationSession` on +/// iOS 13+. +/// @param callback The `GIDSignInCallback` block that is called on completion. This block will be +/// called asynchronously on the main queue. +- (void)signInWithConfiguration:(GIDConfiguration *)configuration + additionalScopes:(NSArray *)additionalScopes + presentingViewController:(UIViewController *)presentingViewController + callback:(nullable GIDSignInCallback)callback; + +/// Starts an interactive sign-in flow using the provided configuration and a login hint. +/// +/// The callback will be called at the end of this process. Any saved sign-in state will be +/// replaced by the result of this flow. Note that this method should not be called when the app is +/// starting up, (e.g in `application:didFinishLaunchingWithOptions:`); instead use the +/// `restorePreviousSignInWithCallback:` method to restore a previous sign-in. +/// +/// @param configuration The configuration properties to be used for this flow. +/// @param additionalScopes Additional scopes to request +/// @param presentingViewController The view controller used to present `SFSafariViewContoller` on +/// iOS 9 and 10 and to supply `presentationContextProvider` for `ASWebAuthenticationSession` on +/// iOS 13+. +/// @param hint An optional hint for the authorization server, for example the user's ID or email +/// address, to be prefilled if possible. +/// @param callback The `GIDSignInCallback` block that is called on completion. This block will be +/// called asynchronously on the main queue. +- (void)signInWithConfiguration:(GIDConfiguration *)configuration + additionalScopes:(NSArray *)additionalScopes + presentingViewController:(UIViewController *)presentingViewController + hint:(nullable NSString *)hint + callback:(nullable GIDSignInCallback)callback; + /// Starts an interactive consent flow to add scopes to the current user's grants. /// /// The callback will be called at the end of this process. If successful, a new `GIDGoogleUser` diff --git a/Package.swift b/Package.swift index 3686efba..6ae9f542 100644 --- a/Package.swift +++ b/Package.swift @@ -17,7 +17,7 @@ import PackageDescription -let googleSignInVersion = "6.0.2" +let googleSignInVersion = "6.0.3" let package = Package( name: "GoogleSignIn",