diff options
Diffstat (limited to 'Firebase/Auth/Source/AuthProviders/Phone/FIRPhoneAuthProvider.m')
-rw-r--r-- | Firebase/Auth/Source/AuthProviders/Phone/FIRPhoneAuthProvider.m | 80 |
1 files changed, 47 insertions, 33 deletions
diff --git a/Firebase/Auth/Source/AuthProviders/Phone/FIRPhoneAuthProvider.m b/Firebase/Auth/Source/AuthProviders/Phone/FIRPhoneAuthProvider.m index a44a340..948a515 100644 --- a/Firebase/Auth/Source/AuthProviders/Phone/FIRPhoneAuthProvider.m +++ b/Firebase/Auth/Source/AuthProviders/Phone/FIRPhoneAuthProvider.m @@ -16,8 +16,6 @@ #import "FIRPhoneAuthProvider.h" -#import <GoogleToolboxForMac/GTMNSDictionary+URLArguments.h> - #import <FirebaseCore/FIRLogger.h> #import "FIRPhoneAuthCredential_Internal.h" #import <FirebaseCore/FIRApp.h> @@ -31,6 +29,7 @@ #import "FIRAuthNotificationManager.h" #import "FIRAuthErrorUtils.h" #import "FIRAuthBackend.h" +#import "FIRAuthWebUtils.h" #import "FirebaseAuthVersion.h" #import <FirebaseCore/FIROptions.h> #import "FIRGetProjectConfigRequest.h" @@ -78,7 +77,7 @@ static NSString *const kAuthTypeVerifyApp = @"verifyApp"; /** @var kReCAPTCHAURLStringFormat @brief The format of the URL used to open the reCAPTCHA page during app verification. */ -NSString *const kReCAPTCHAURLStringFormat = @"https://%@/__/auth/handler?%@"; +NSString *const kReCAPTCHAURLStringFormat = @"https://%@/__/auth/handler?"; @implementation FIRPhoneAuthProvider { @@ -244,15 +243,22 @@ NSString *const kReCAPTCHAURLStringFormat = @"https://%@/__/auth/handler?%@"; @return The reCAPTCHA token if successful. */ - (NSString *)reCAPTCHATokenForURL:(NSURL *)URL error:(NSError **)error { - NSDictionary<NSString *, NSString *> *URLQueryItems = - [NSDictionary gtm_dictionaryWithHttpArgumentsString:URL.query]; - NSURL *deepLinkURL = [NSURL URLWithString:URLQueryItems[@"deep_link_id"]]; - URLQueryItems = - [NSDictionary gtm_dictionaryWithHttpArgumentsString:deepLinkURL.query]; - if (URLQueryItems[@"recaptchaToken"]) { - return URLQueryItems[@"recaptchaToken"]; + NSURLComponents *actualURLComponents = [NSURLComponents componentsWithURL:URL resolvingAgainstBaseURL:NO]; + NSArray<NSURLQueryItem *> *queryItems = [actualURLComponents queryItems]; + NSString *deepLinkURL = [FIRAuthWebUtils queryItemValue:@"deep_link_id" from:queryItems]; + NSData *errorData; + if (deepLinkURL) { + actualURLComponents = [NSURLComponents componentsWithString:deepLinkURL]; + queryItems = [actualURLComponents queryItems]; + NSString *recaptchaToken = [FIRAuthWebUtils queryItemValue:@"recaptchaToken" from:queryItems]; + if (recaptchaToken) { + return recaptchaToken; + } + NSString *firebaseError = [FIRAuthWebUtils queryItemValue:@"firebaseError" from:queryItems]; + errorData = [firebaseError dataUsingEncoding:NSUTF8StringEncoding]; + } else { + errorData = nil; } - NSData *errorData = [URLQueryItems[@"firebaseError"] dataUsingEncoding:NSUTF8StringEncoding]; NSError *jsonError; NSDictionary *errorDict = [NSJSONSerialization JSONObjectWithData:errorData options:0 @@ -298,13 +304,19 @@ NSString *const kReCAPTCHAURLStringFormat = @"https://%@/__/auth/handler?%@"; if (!([[expectedURLComponents URL] isEqual:[actualURLComponents URL]])) { return NO; } - NSDictionary<NSString *, NSString *> *URLQueryItems = - [NSDictionary gtm_dictionaryWithHttpArgumentsString:URL.query]; - NSURL *deeplinkURL = [NSURL URLWithString:URLQueryItems[@"deep_link_id"]]; - NSDictionary<NSString *, NSString *> *deeplinkQueryItems = - [NSDictionary gtm_dictionaryWithHttpArgumentsString:deeplinkURL.query]; - if ([deeplinkQueryItems[@"authType"] isEqualToString:kAuthTypeVerifyApp] && - [deeplinkQueryItems[@"eventId"] isEqualToString:eventID]) { + actualURLComponents = [NSURLComponents componentsWithURL:URL resolvingAgainstBaseURL:NO]; + NSArray<NSURLQueryItem *> *queryItems = [actualURLComponents queryItems]; + NSString *deepLinkURL = [FIRAuthWebUtils queryItemValue:@"deep_link_id" from:queryItems]; + if (deepLinkURL == nil) { + return NO; + } + NSURLComponents *deepLinkURLComponents = [NSURLComponents componentsWithString:deepLinkURL]; + NSArray<NSURLQueryItem *> *deepLinkQueryItems = [deepLinkURLComponents queryItems]; + + NSString *deepLinkAuthType = [FIRAuthWebUtils queryItemValue:@"authType" from:deepLinkQueryItems]; + NSString *deepLinkEventID = [FIRAuthWebUtils queryItemValue:@"eventId" from:deepLinkQueryItems]; + if ([deepLinkAuthType isEqualToString:kAuthTypeVerifyApp] && + [deepLinkEventID isEqualToString:eventID]) { return YES; } return NO; @@ -444,27 +456,29 @@ NSString *const kReCAPTCHAURLStringFormat = @"https://%@/__/auth/handler?%@"; return; } NSString *bundleID = [NSBundle mainBundle].bundleIdentifier; - NSString *clienID = self->_auth.app.options.clientID; + NSString *clientID = self->_auth.app.options.clientID; NSString *apiKey = self->_auth.requestConfiguration.APIKey; - NSMutableDictionary *urlArguments = [[NSMutableDictionary alloc] initWithDictionary: @{ - @"apiKey" : apiKey, - @"authType" : kAuthTypeVerifyApp, - @"ibi" : bundleID ?: @"", - @"clientId" : clienID, - @"v" : [FIRAuthBackend authUserAgent], - @"eventId" : eventID, - }]; + NSMutableArray<NSURLQueryItem *> *queryItems = [@[ + [NSURLQueryItem queryItemWithName:@"apiKey" value:apiKey], + [NSURLQueryItem queryItemWithName:@"authType" value:kAuthTypeVerifyApp], + [NSURLQueryItem queryItemWithName:@"ibi" value:bundleID ?: @""], + [NSURLQueryItem queryItemWithName:@"clientId" value:clientID], + [NSURLQueryItem queryItemWithName:@"v" value:[FIRAuthBackend authUserAgent]], + [NSURLQueryItem queryItemWithName:@"eventId" value:eventID] + ] mutableCopy + ]; + if (self->_auth.requestConfiguration.languageCode) { - urlArguments[@"hl"] = self->_auth.requestConfiguration.languageCode; + [queryItems addObject:[NSURLQueryItem queryItemWithName:@"hl"value: + self->_auth.requestConfiguration.languageCode]]; } - NSString *argumentsString = [urlArguments gtm_httpArgumentsString]; - NSString *URLString = - [NSString stringWithFormat:kReCAPTCHAURLStringFormat, authDomain, argumentsString]; - completion([NSURL URLWithString:URLString], nil); + NSURLComponents *components = [[NSURLComponents alloc] initWithString: + [NSString stringWithFormat:kReCAPTCHAURLStringFormat, authDomain]]; + [components setQueryItems:queryItems]; + completion([components URL], nil); }]; } - /** @fn fetchAuthDomainWithCompletion:completion: @brief Fetches the auth domain associated with the Firebase Project. @param completion The callback invoked after the auth domain has been constructed or an error |