Skip to content

Commit

Permalink
AWSGoogleSignIn upgrade to GoogleSignIn 8.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Bill Bunting committed Feb 2, 2025
1 parent fa5792c commit 6ca4b99
Show file tree
Hide file tree
Showing 10 changed files with 544 additions and 247 deletions.
69 changes: 18 additions & 51 deletions AWSAuthSDK/Dependencies/GoogleHeaders/GIDAuthentication.h
Original file line number Diff line number Diff line change
@@ -1,65 +1,32 @@
/*
* GIDAuthentication.h
* Google Sign-In iOS SDK
* Copyright 2022 Google LLC
*
* Copyright 2014 Google Inc.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* Use of this SDK is subject to the Google APIs Terms of Service:
* https://developers.google.com/terms/
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#import <Foundation/Foundation.h>

@protocol GTMFetcherAuthorizationProtocol;
@class GIDAuthentication;

/// The callback block that takes a `GIDAuthentication`, or an error if attempt
/// to refresh was unsuccessful.
typedef void (^GIDAuthenticationHandler)(GIDAuthentication *authentication, NSError *error);
@class OIDAuthState;

/// The callback block that takes an access token, or an error if attempt to refresh was
/// unsuccessful.
typedef void (^GIDAccessTokenHandler)(NSString *accessToken, NSError *error);
NS_ASSUME_NONNULL_BEGIN

/// This class represents the OAuth 2.0 entities needed for sign-in.
// Internal class for GIDGoogleUser NSCoding backward compatibility.
@interface GIDAuthentication : NSObject <NSSecureCoding>

/// The client ID associated with the authentication.
@property(nonatomic, readonly) NSString *clientID;

/// The OAuth2 access token to access Google services.
@property(nonatomic, readonly) NSString *accessToken;

/// The estimated expiration date of the access token.
@property(nonatomic, readonly) NSDate *accessTokenExpirationDate;

/// The OAuth2 refresh token to exchange for new access tokens.
@property(nonatomic, readonly) NSString *refreshToken;
@property(nonatomic) OIDAuthState* authState;

/// An OpenID Connect ID token that identifies the user. Send this token to your server to
/// authenticate the user there. For more information on this topic, see
/// https://developers.google.com/identity/sign-in/ios/backend-auth
@property(nonatomic, readonly) NSString *idToken;

/// The estimated expiration date of the ID token.
@property(nonatomic, readonly) NSDate *idTokenExpirationDate;

/// Gets a new authorizer for `GTLService`, `GTMSessionFetcher`, or `GTMHTTPFetcher`.
///
/// @return A new authorizer
- (id<GTMFetcherAuthorizationProtocol>)fetcherAuthorizer;

/// Get a valid access token and a valid ID token, refreshing them first if they have expired or are
/// about to expire.
///
/// @param handler A callback block that takes a `GIDAuthentication`, or an
/// error if attempt to refresh was unsuccessful.
- (void)getTokensWithHandler:(GIDAuthenticationHandler)handler;

/// Refreshes the access token and the ID token using the refresh token.
///
/// @param handler A callback block that takes a `GIDAuthentication`, or an
/// error if attempt to refresh was unsuccessful.
- (void)refreshTokensWithHandler:(GIDAuthenticationHandler)handler;
- (instancetype)initWithAuthState:(OIDAuthState *)authState;

@end

NS_ASSUME_NONNULL_END
77 changes: 77 additions & 0 deletions AWSAuthSDK/Dependencies/GoogleHeaders/GIDConfiguration.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* Copyright 2021 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

/// This class represents the client configuration provided by the developer.
@interface GIDConfiguration : NSObject <NSCopying, NSSecureCoding>

/// The client ID of the app from the Google Cloud Console.
@property(nonatomic, readonly) NSString *clientID;

/// The client ID of the home server. This will be returned as the `audience` property of the
/// OpenID Connect ID token. For more info on the ID token:
/// https://developers.google.com/identity/sign-in/ios/backend-auth
@property(nonatomic, readonly, nullable) NSString *serverClientID;

/// The Google Apps domain to which users must belong to sign in. To verify, check
/// `GIDGoogleUser`'s `hostedDomain` property.
@property(nonatomic, readonly, nullable) NSString *hostedDomain;

/// The OpenID2 realm of the home server. This allows Google to include the user's OpenID
/// Identifier in the OpenID Connect ID token.
@property(nonatomic, readonly, nullable) NSString *openIDRealm;

/// Unavailable. Please use `initWithClientID:` or one of the other initializers below.
/// :nodoc:
+ (instancetype)new NS_UNAVAILABLE;

/// Unavailable. Please use `initWithClientID:` or one of the other initializers below.
/// :nodoc:
- (instancetype)init NS_UNAVAILABLE;

/// Initialize a `GIDConfiguration` object with a client ID.
///
/// @param clientID The client ID of the app.
/// @return An initialized `GIDConfiguration` instance.
- (instancetype)initWithClientID:(NSString *)clientID;

/// Initialize a `GIDConfiguration` object with a client ID and server client ID.
///
/// @param clientID The client ID of the app.
/// @param serverClientID The server's client ID.
/// @return An initialized `GIDConfiguration` instance.
- (instancetype)initWithClientID:(NSString *)clientID
serverClientID:(nullable NSString *)serverClientID;

/// Initialize a `GIDConfiguration` object by specifying all available properties.
///
/// @param clientID The client ID of the app.
/// @param serverClientID The server's client ID.
/// @param hostedDomain The Google Apps domain to be used.
/// @param openIDRealm The OpenID realm to be used.
/// @return An initialized `GIDConfiguration` instance.
- (instancetype)initWithClientID:(NSString *)clientID
serverClientID:(nullable NSString *)serverClientID
hostedDomain:(nullable NSString *)hostedDomain
openIDRealm:(nullable NSString *)openIDRealm NS_DESIGNATED_INITIALIZER;

@end

NS_ASSUME_NONNULL_END

115 changes: 95 additions & 20 deletions AWSAuthSDK/Dependencies/GoogleHeaders/GIDGoogleUser.h
Original file line number Diff line number Diff line change
@@ -1,39 +1,114 @@
/*
* GIDGoogleUser.h
* Google Sign-In iOS SDK
* Copyright 2022 Google LLC
*
* Copyright 2014 Google Inc.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* Use of this SDK is subject to the Google APIs Terms of Service:
* https://developers.google.com/terms/
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#import <Foundation/Foundation.h>
#import <TargetConditionals.h>

#if __has_include(<UIKit/UIKit.h>)
#import <UIKit/UIKit.h>
#elif __has_include(<AppKit/AppKit.h>)
#import <AppKit/AppKit.h>
#endif

@class GIDAuthentication;

@class GIDConfiguration;
@class GIDSignInResult;
@class GIDToken;
@class GIDProfileData;

/// This class represents a user account.
NS_ASSUME_NONNULL_BEGIN

/// This class represents a signed-in user.
@interface GIDGoogleUser : NSObject <NSSecureCoding>

/// The Google user ID.
@property(nonatomic, readonly) NSString *userID;
@property(nonatomic, readonly, nullable) NSString *userID;

/// The basic profile data for the user.
@property(nonatomic, readonly, nullable) GIDProfileData *profile;

/// The OAuth2 scopes granted to the app in an array of `NSString`.
@property(nonatomic, readonly, nullable) NSArray<NSString *> *grantedScopes;

/// The configuration that was used to sign in this user.
@property(nonatomic, readonly) GIDConfiguration *configuration;

/// Representation of the Basic profile data. It is only available if
/// `GIDSignIn.shouldFetchBasicProfile` is set and either `-[GIDSignIn signIn]` or
/// `-[GIDSignIn restorePreviousSignIn]` has been completed successfully.
@property(nonatomic, readonly) GIDProfileData *profile;
/// The OAuth2 access token to access Google services.
@property(nonatomic, readonly) GIDToken *accessToken;

/// The authentication object for the user.
@property(nonatomic, readonly) GIDAuthentication *authentication;
/// The OAuth2 refresh token to exchange for new access tokens.
@property(nonatomic, readonly) GIDToken *refreshToken;

/// The API scopes granted to the app in an array of `NSString`.
@property(nonatomic, readonly) NSArray *grantedScopes;
/// The OpenID Connect ID token that identifies the user.
///
/// Send this token to your server to authenticate the user there. For more information on this topic,
/// see https://developers.google.com/identity/sign-in/ios/backend-auth.
@property(nonatomic, readonly, nullable) GIDToken *idToken;

/// For Google Apps hosted accounts, the domain of the user.
@property(nonatomic, readonly) NSString *hostedDomain;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
/// The authorizer for use with `GTLRService`, `GTMSessionFetcher`, or `GTMHTTPFetcher`.
// @property(nonatomic, readonly) id<GTMFetcherAuthorizationProtocol> fetcherAuthorizer;
#pragma clang diagnostic pop

/// An OAuth2 authorization code for the home server.
@property(nonatomic, readonly) NSString *serverAuthCode;
/// Refresh the user's access and ID tokens if they have expired or are about to expire.
///
/// @param completion A completion block that takes a `GIDGoogleUser` or an error if the attempt to
/// refresh tokens was unsuccessful. The block will be called asynchronously on the main queue.
- (void)refreshTokensIfNeededWithCompletion:(void (^)(GIDGoogleUser *_Nullable user,
NSError *_Nullable error))completion;

#if TARGET_OS_IOS || TARGET_OS_MACCATALYST

/// Starts an interactive consent flow on iOS to add new scopes to the user's `grantedScopes`.
///
/// The completion will be called at the end of this process. If successful, a `GIDSignInResult`
/// instance will be returned reflecting the new scopes and saved sign-in state will be updated.
///
/// @param scopes The scopes to ask the user to consent to.
/// @param presentingViewController The view controller used to present `SFSafariViewController` on
/// iOS 9 and 10 and to supply `presentationContextProvider` for `ASWebAuthenticationSession` on
/// iOS 13+.
/// @param completion The optional block that is called on completion. This block will be called
/// asynchronously on the main queue.
- (void)addScopes:(NSArray<NSString *> *)scopes
presentingViewController:(UIViewController *)presentingViewController
completion:(nullable void (^)(GIDSignInResult *_Nullable signInResult,
NSError *_Nullable error))completion
NS_EXTENSION_UNAVAILABLE("The add scopes flow is not supported in App Extensions.");

#elif TARGET_OS_OSX

/// Starts an interactive consent flow on macOS to add new scopes to the user's `grantedScopes`.
///
/// The completion will be called at the end of this process. If successful, a `GIDSignInResult`
/// instance will be returned reflecting the new scopes and saved sign-in state will be updated.
///
/// @param scopes An array of scopes to ask the user to consent to.
/// @param presentingWindow The window used to supply `presentationContextProvider` for
/// `ASWebAuthenticationSession`.
/// @param completion The optional block that is called on completion. This block will be called
/// asynchronously on the main queue.
- (void)addScopes:(NSArray<NSString *> *)scopes
presentingWindow:(NSWindow *)presentingWindow
completion:(nullable void (^)(GIDSignInResult *_Nullable signInResult,
NSError *_Nullable error))completion;

#endif

@end

NS_ASSUME_NONNULL_END
Loading

0 comments on commit 6ca4b99

Please sign in to comment.