aboutsummaryrefslogtreecommitdiffhomepage
path: root/Firebase/Auth/Source/RPCs
diff options
context:
space:
mode:
Diffstat (limited to 'Firebase/Auth/Source/RPCs')
-rw-r--r--Firebase/Auth/Source/RPCs/FIRAuthBackend.h496
-rw-r--r--Firebase/Auth/Source/RPCs/FIRAuthBackend.m943
-rw-r--r--Firebase/Auth/Source/RPCs/FIRAuthRPCRequest.h40
-rw-r--r--Firebase/Auth/Source/RPCs/FIRAuthRPCResponse.h49
-rw-r--r--Firebase/Auth/Source/RPCs/FIRCreateAuthURIRequest.h86
-rw-r--r--Firebase/Auth/Source/RPCs/FIRCreateAuthURIRequest.m95
-rw-r--r--Firebase/Auth/Source/RPCs/FIRCreateAuthURIResponse.h56
-rw-r--r--Firebase/Auth/Source/RPCs/FIRCreateAuthURIResponse.m33
-rw-r--r--Firebase/Auth/Source/RPCs/FIRDeleteAccountRequest.h48
-rw-r--r--Firebase/Auth/Source/RPCs/FIRDeleteAccountRequest.m65
-rw-r--r--Firebase/Auth/Source/RPCs/FIRDeleteAccountResponse.h26
-rw-r--r--Firebase/Auth/Source/RPCs/FIRDeleteAccountResponse.m28
-rw-r--r--Firebase/Auth/Source/RPCs/FIRGetAccountInfoRequest.h51
-rw-r--r--Firebase/Auth/Source/RPCs/FIRGetAccountInfoRequest.m47
-rw-r--r--Firebase/Auth/Source/RPCs/FIRGetAccountInfoResponse.h146
-rw-r--r--Firebase/Auth/Source/RPCs/FIRGetAccountInfoResponse.m94
-rw-r--r--Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeRequest.h87
-rw-r--r--Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeRequest.m135
-rw-r--r--Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeResponse.h35
-rw-r--r--Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeResponse.m38
-rw-r--r--Firebase/Auth/Source/RPCs/FIRIdentityToolkitRequest.h57
-rw-r--r--Firebase/Auth/Source/RPCs/FIRIdentityToolkitRequest.m57
-rw-r--r--Firebase/Auth/Source/RPCs/FIRResetPasswordRequest.h53
-rw-r--r--Firebase/Auth/Source/RPCs/FIRResetPasswordRequest.m56
-rw-r--r--Firebase/Auth/Source/RPCs/FIRResetPasswordResponse.h52
-rw-r--r--Firebase/Auth/Source/RPCs/FIRResetPasswordResponse.m31
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSecureTokenRequest.h109
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSecureTokenRequest.m141
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSecureTokenResponse.h50
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSecureTokenResponse.m70
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSendVerificationCodeRequest.h56
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSendVerificationCodeRequest.m73
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSendVerificationCodeResponse.h32
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSendVerificationCodeResponse.m36
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSetAccountInfoRequest.h149
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSetAccountInfoRequest.m174
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSetAccountInfoResponse.h98
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSetAccountInfoResponse.m61
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSignUpNewUserRequest.h67
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSignUpNewUserRequest.m82
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSignUpNewUserResponse.h44
-rw-r--r--Firebase/Auth/Source/RPCs/FIRSignUpNewUserResponse.m32
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyAssertionRequest.h100
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyAssertionRequest.m142
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyAssertionResponse.h186
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyAssertionResponse.m78
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyClientRequest.h53
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyClientRequest.m63
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyClientResponse.h38
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyClientResponse.m33
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenRequest.h56
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenRequest.m56
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenResponse.h47
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenResponse.m32
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyPasswordRequest.h79
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyPasswordRequest.m91
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyPasswordResponse.h72
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyPasswordResponse.m36
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberRequest.h78
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberRequest.m97
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberResponse.h64
-rw-r--r--Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberResponse.m42
62 files changed, 5621 insertions, 0 deletions
diff --git a/Firebase/Auth/Source/RPCs/FIRAuthBackend.h b/Firebase/Auth/Source/RPCs/FIRAuthBackend.h
new file mode 100644
index 0000000..519a6e7
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRAuthBackend.h
@@ -0,0 +1,496 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+@class FIRCreateAuthURIRequest;
+@class FIRCreateAuthURIResponse;
+@class FIRGetAccountInfoRequest;
+@class FIRGetAccountInfoResponse;
+@class FIRGetOOBConfirmationCodeRequest;
+@class FIRGetOOBConfirmationCodeResponse;
+@class FIRResetPasswordRequest;
+@class FIRResetPasswordResponse;
+@class FIRSecureTokenRequest;
+@class FIRSecureTokenResponse;
+@class FIRSetAccountInfoRequest;
+@class FIRSetAccountInfoResponse;
+@class FIRVerifyAssertionRequest;
+@class FIRVerifyAssertionResponse;
+@class FIRVerifyClientRequest;
+@class FIRVerifyClientResponse;
+@class FIRVerifyCustomTokenRequest;
+@class FIRVerifyCustomTokenResponse;
+@class FIRVerifyPasswordRequest;
+@class FIRVerifyPasswordResponse;
+@class FIRVerifyPhoneNumberRequest;
+@class FIRVerifyPhoneNumberResponse;
+@class FIRSendVerificationCodeRequest;
+@class FIRSendVerificationCodeResponse;
+@class FIRSignUpNewUserRequest;
+@class FIRSignUpNewUserResponse;
+@class FIRDeleteAccountRequest;
+@class FIRDeleteAccountResponse;
+@protocol FIRAuthBackendImplementation;
+@protocol FIRAuthBackendRPCIssuer;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @typedef FIRAuthBackendRPCIssuerCompletionHandler
+ @brief The type of block used to return the result of a call to an endpoint.
+ @param data The HTTP response body.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRAuthBackendRPCIssuerCompletionHandler)(NSData *_Nullable data,
+ NSError *_Nullable error);
+
+/** @typedef FIRCreateAuthURIResponseCallback
+ @brief The type of block used to return the result of a call to the createAuthURI
+ endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRCreateAuthURIResponseCallback)
+ (FIRCreateAuthURIResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRGetAccountInfoResponseCallback
+ @brief The type of block used to return the result of a call to the getAccountInfo
+ endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRGetAccountInfoResponseCallback)
+ (FIRGetAccountInfoResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRSetAccountInfoResponseCallback
+ @brief The type of block used to return the result of a call to the setAccountInfo
+ endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRSetAccountInfoResponseCallback)
+ (FIRSetAccountInfoResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRSecureTokenResponseCallback
+ @brief The type of block used to return the result of a call to the token endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRSecureTokenResponseCallback)
+ (FIRSecureTokenResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRVerifyAssertionResponseCallback
+ @brief The type of block used to return the result of a call to the verifyAssertion
+ endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRVerifyAssertionResponseCallback)
+ (FIRVerifyAssertionResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRVerifyPasswordResponseCallback
+ @brief The type of block used to return the result of a call to the verifyPassword
+ endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRVerifyPasswordResponseCallback)
+ (FIRVerifyPasswordResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRVerifyCustomTokenResponseCallback
+ @brief The type of block used to return the result of a call to the verifyCustomToken
+ endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRVerifyCustomTokenResponseCallback)
+ (FIRVerifyCustomTokenResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRDeleteCallBack
+ @brief The type of block called when a request delete account has finished.
+ @param error The error which occurred, or nil if the request was successful.
+ */
+typedef void (^FIRDeleteCallBack)(NSError *_Nullable error);
+
+/** @typedef FIRGetOOBConfirmationCodeResponseCallback
+ @brief The type of block used to return the result of a call to the getOOBConfirmationCode
+ endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRGetOOBConfirmationCodeResponseCallback)
+ (FIRGetOOBConfirmationCodeResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRSignupNewUserCallback
+ @brief The type of block used to return the result of a call to the signupNewUser endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRSignupNewUserCallback)
+ (FIRSignUpNewUserResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRResetPasswordCallback
+ @brief The type of block used to return the result of a call to the resetPassword endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRResetPasswordCallback)
+ (FIRResetPasswordResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRSendVerificationCodeResponseCallback
+ @brief The type of block used to return the result of a call to the sendVerificationCode
+ endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRSendVerificationCodeResponseCallback)
+ (FIRSendVerificationCodeResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRVerifyPhoneNumberResponseCallback
+ @brief The type of block used to return the result of a call to the verifyPhoneNumber endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRVerifyPhoneNumberResponseCallback)
+ (FIRVerifyPhoneNumberResponse *_Nullable response, NSError *_Nullable error);
+
+/** @typedef FIRVerifyClientResponseCallback
+ @brief The type of block used to return the result of a call to the verifyClient endpoint.
+ @param response The received response, if any.
+ @param error The error which occurred, if any.
+ @remarks One of response or error will be non-nil.
+ */
+typedef void (^FIRVerifyClientResponseCallback)
+ (FIRVerifyClientResponse *_Nullable response, NSError *_Nullable error);
+
+/** @class FIRAuthBackend
+ @brief Simple static class with methods representing the backend RPCs.
+ @remarks All callback blocks passed as method parameters are invoked asynchronously on the
+ global work queue in the future. See
+ https://github.com/firebase/firebase-ios-sdk/tree/master/Firebase/Auth/Docs/threading.ml
+ */
+@interface FIRAuthBackend : NSObject
+
+/** @fn setBackendImplementation:
+ @brief Changes the default backend implementation to something else.
+ @param backendImplementation The backend implementation to use.
+ @remarks This is not, generally, safe to call in a scenario where other backend requests may
+ be occuring. This is specifically to help mock the backend for testing purposes.
+ */
++ (void)setBackendImplementation:(id<FIRAuthBackendImplementation>)backendImplementation;
+
+/** @fn setDefaultBackendImplementationWithRPCIssuer:
+ @brief Uses the default backend implementation, but with a custom RPC issuer.
+ @param RPCIssuer The RPC issuer to use. If @c nil, will use the default implementation.
+ @remarks This is not, generally, safe to call in a scenario where other backend requests may
+ be occuring. This is specifically to help test the backend interfaces (requests, responses,
+ and shared FIRAuthBackend logic.)
+ */
++ (void)setDefaultBackendImplementationWithRPCIssuer:
+ (nullable id<FIRAuthBackendRPCIssuer>)RPCIssuer;
+
+/** @fn createAuthURI:callback:
+ @brief Calls the createAuthURI endpoint, which is responsible for creating the URI used by the
+ IdP to authenticate the user.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)createAuthURI:(FIRCreateAuthURIRequest *)request
+ callback:(FIRCreateAuthURIResponseCallback)callback;
+
+/** @fn getAccountInfo:callback:
+ @brief Calls the getAccountInfo endpoint, which returns account info for a given account.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)getAccountInfo:(FIRGetAccountInfoRequest *)request
+ callback:(FIRGetAccountInfoResponseCallback)callback;
+
+/** @fn setAccountInfo:callback:
+ @brief Calls the setAccountInfo endpoint, which is responsible for setting account info for a
+ user, for example, to sign up a new user with email and password.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)setAccountInfo:(FIRSetAccountInfoRequest *)request
+ callback:(FIRSetAccountInfoResponseCallback)callback;
+
+/** @fn verifyAssertion:callback:
+ @brief Calls the verifyAssertion endpoint, which is responsible for authenticating a
+ user who has IDP-related credentials (an ID Token, an Access Token, etc.)
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)verifyAssertion:(FIRVerifyAssertionRequest *)request
+ callback:(FIRVerifyAssertionResponseCallback)callback;
+
+/** @fn verifyCustomToken:callback:
+ @brief Calls the verifyCustomToken endpoint, which is responsible for authenticating a
+ user who has BYOAuth credentials (a self-signed token using their BYOAuth private key.)
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)verifyCustomToken:(FIRVerifyCustomTokenRequest *)request
+ callback:(FIRVerifyCustomTokenResponseCallback)callback;
+
+/** @fn verifyPassword:callback:
+ @brief Calls the verifyPassword endpoint, which is responsible for authenticating a
+ user who has email and password credentials.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)verifyPassword:(FIRVerifyPasswordRequest *)request
+ callback:(FIRVerifyPasswordResponseCallback)callback;
+
+/** @fn secureToken:callback:
+ @brief Calls the token endpoint, which is responsible for performing STS token exchanges and
+ token refreshes.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)secureToken:(FIRSecureTokenRequest *)request
+ callback:(FIRSecureTokenResponseCallback)callback;
+
+/** @fn getOOBConfirmationCode:callback:
+ @brief Calls the getOOBConfirmationCode endpoint, which is responsible for sending email change
+ request emails, and password reset emails.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)getOOBConfirmationCode:(FIRGetOOBConfirmationCodeRequest *)request
+ callback:(FIRGetOOBConfirmationCodeResponseCallback)callback;
+
+/** @fn signUpNewUser:
+ @brief Calls the signUpNewUser endpoint, which is responsible anonymously signing up a user
+ or signing in a user anonymously.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)signUpNewUser:(FIRSignUpNewUserRequest *)request
+ callback:(FIRSignupNewUserCallback)callback;
+
+/** @fn resetPassword:callback
+ @brief Calls the resetPassword endpoint, which is responsible for resetting a user's password
+ given an OOB code and new password.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)resetPassword:(FIRResetPasswordRequest *)request
+ callback:(FIRResetPasswordCallback)callback;
+
+/** @fn deleteAccount:
+ @brief Calls the DeleteAccount endpoint, which is responsible for deleting a user.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)deleteAccount:(FIRDeleteAccountRequest *)request
+ callback:(FIRDeleteCallBack)callback;
+
+/** @fn sendVerificationCode:callback:
+ @brief Calls the sendVerificationCode endpoint, which is responsible for sending the
+ verification code to a phone number specified in the request parameters.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)sendVerificationCode:(FIRSendVerificationCodeRequest *)request
+ callback:(FIRSendVerificationCodeResponseCallback)callback;
+
+/** @fn verifyPhoneNumber:callback:
+ @brief Calls the verifyPhoneNumber endpoint, which is responsible for sending the verification
+ code to a phone number specified in the request parameters.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)verifyPhoneNumber:(FIRVerifyPhoneNumberRequest *)request
+ callback:(FIRVerifyPhoneNumberResponseCallback)callback;
+
+/** @fn verifyClient:callback:
+ @brief Calls the verifyClient endpoint, which is responsible for sending the silent push
+ notification used for app validation to the device provided in the request parameters.
+ @param request The request parameters.
+ @param callback The callback.
+ */
++ (void)verifyClient:(FIRVerifyClientRequest *)request
+ callback:(FIRVerifyClientResponseCallback)callback;
+
+@end
+
+/** @protocol FIRAuthBackendRPCIssuer
+ @brief Used to make FIRAuthBackend
+ */
+@protocol FIRAuthBackendRPCIssuer <NSObject>
+
+/** @fn asyncPostToURL:body:contentType:completionHandler:
+ @brief Asynchronously sends a POST request.
+ @param URL URL of the request.
+ @param body Request body.
+ @param contentType Content type of the body.
+ @param handler provided that handles POST response. Invoked asynchronously on the auth global
+ work queue in the future.
+ */
+- (void)asyncPostToURL:(NSURL *)URL
+ body:(NSData *)body
+ contentType:(NSString *)contentType
+ completionHandler:(FIRAuthBackendRPCIssuerCompletionHandler)handler;
+
+@end
+
+/** @protocol FIRAuthBackendImplementation
+ @brief Used to make FIRAuthBackend provide a layer of indirection to an actual RPC-based backend
+ or a mock backend.
+ */
+@protocol FIRAuthBackendImplementation <NSObject>
+
+/** @fn createAuthURI:callback:
+ @brief Calls the createAuthURI endpoint, which is responsible for creating the URI used by the
+ IdP to authenticate the user.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)createAuthURI:(FIRCreateAuthURIRequest *)request
+ callback:(FIRCreateAuthURIResponseCallback)callback;
+
+/** @fn getAccountInfo:callback:
+ @brief Calls the getAccountInfo endpoint, which returns account info for a given account.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)getAccountInfo:(FIRGetAccountInfoRequest *)request
+ callback:(FIRGetAccountInfoResponseCallback)callback;
+
+/** @fn setAccountInfo:callback:
+ @brief Calls the setAccountInfo endpoint, which is responsible for setting account info for a
+ user, for example, to sign up a new user with email and password.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)setAccountInfo:(FIRSetAccountInfoRequest *)request
+ callback:(FIRSetAccountInfoResponseCallback)callback;
+
+/** @fn verifyAssertion:callback:
+ @brief Calls the verifyAssertion endpoint, which is responsible for authenticating a
+ user who has IDP-related credentials (an ID Token, an Access Token, etc.)
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)verifyAssertion:(FIRVerifyAssertionRequest *)request
+ callback:(FIRVerifyAssertionResponseCallback)callback;
+
+/** @fn verifyCustomToken:callback:
+ @brief Calls the verifyCustomToken endpoint, which is responsible for authenticating a
+ user who has BYOAuth credentials (a self-signed token using their BYOAuth private key.)
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)verifyCustomToken:(FIRVerifyCustomTokenRequest *)request
+ callback:(FIRVerifyCustomTokenResponseCallback)callback;
+
+/** @fn verifyPassword:callback:
+ @brief Calls the verifyPassword endpoint, which is responsible for authenticating a
+ user who has email and password credentials.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)verifyPassword:(FIRVerifyPasswordRequest *)request
+ callback:(FIRVerifyPasswordResponseCallback)callback;
+
+/** @fn secureToken:callback:
+ @brief Calls the token endpoint, which is responsible for performing STS token exchanges and
+ token refreshes.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)secureToken:(FIRSecureTokenRequest *)request
+ callback:(FIRSecureTokenResponseCallback)callback;
+
+/** @fn getOOBConfirmationCode:callback:
+ @brief Calls the getOOBConfirmationCode endpoint, which is responsible for sending email change
+ request emails, and password reset emails.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)getOOBConfirmationCode:(FIRGetOOBConfirmationCodeRequest *)request
+ callback:(FIRGetOOBConfirmationCodeResponseCallback)callback;
+
+/** @fn signUpNewUser:
+ @brief Calls the signUpNewUser endpoint, which is responsible anonymously signing up a user
+ or signing in a user anonymously.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)signUpNewUser:(FIRSignUpNewUserRequest *)request
+ callback:(FIRSignupNewUserCallback)callback;
+
+/** @fn deleteAccount:
+ @brief Calls the DeleteAccount endpoint, which is responsible for deleting a user.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)deleteAccount:(FIRDeleteAccountRequest *)request
+ callback:(FIRDeleteCallBack)callback;
+
+/** @fn sendVerificationCode:callback:
+ @brief Calls the sendVerificationCode endpoint, which is responsible for sending the
+ verification code to a phone number specified in the request parameters.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)sendVerificationCode:(FIRSendVerificationCodeRequest *)request
+ callback:(FIRSendVerificationCodeResponseCallback)callback;
+
+/** @fn verifyPhoneNumber:callback:
+ @brief Calls the verifyPhoneNumber endpoint, which is responsible for sending the verification
+ code to a phone number specified in the request parameters.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)verifyPhoneNumber:(FIRVerifyPhoneNumberRequest *)request
+ callback:(FIRVerifyPhoneNumberResponseCallback)callback;
+
+/** @fn verifyClient:callback:
+ @brief Calls the verifyClient endpoint, which is responsible for sending the silent push
+ notification used for app validation to the device provided in the request parameters.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)verifyClient:(FIRVerifyClientRequest *)request
+ callback:(FIRVerifyClientResponseCallback)callback;
+
+/** @fn resetPassword:callback
+ @brief Calls the resetPassword endpoint, which is responsible for resetting a user's password
+ given an OOB code and new password.
+ @param request The request parameters.
+ @param callback The callback.
+ */
+- (void)resetPassword:(FIRResetPasswordRequest *)request
+ callback:(FIRResetPasswordCallback)callback;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRAuthBackend.m b/Firebase/Auth/Source/RPCs/FIRAuthBackend.m
new file mode 100644
index 0000000..3efc602
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRAuthBackend.m
@@ -0,0 +1,943 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRAuthBackend.h"
+
+#import "../AuthProviders/Phone/FIRPhoneAuthCredential_Internal.h"
+#import "../AuthProviders/Phone/FIRPhoneAuthProvider.h"
+#import "../Private/FIRAuthErrorUtils.h"
+#import "../Private/FIRAuthGlobalWorkQueue.h"
+#import "FirebaseAuth.h"
+#import "FIRAuthRPCRequest.h"
+#import "FIRAuthRPCResponse.h"
+#import "FIRCreateAuthURIRequest.h"
+#import "FIRCreateAuthURIResponse.h"
+#import "FIRDeleteAccountRequest.h"
+#import "FIRDeleteAccountResponse.h"
+#import "FIRGetAccountInfoRequest.h"
+#import "FIRGetAccountInfoResponse.h"
+#import "FIRGetOOBConfirmationCodeRequest.h"
+#import "FIRGetOOBConfirmationCodeResponse.h"
+#import "FIRResetPasswordRequest.h"
+#import "FIRResetPasswordResponse.h"
+#import "FIRSendVerificationCodeRequest.h"
+#import "FIRSendVerificationCodeResponse.h"
+#import "FIRSecureTokenRequest.h"
+#import "FIRSecureTokenResponse.h"
+#import "FIRSetAccountInfoRequest.h"
+#import "FIRSetAccountInfoResponse.h"
+#import "FIRSignUpNewUserRequest.h"
+#import "FIRSignUpNewUserResponse.h"
+#import "FIRVerifyAssertionRequest.h"
+#import "FIRVerifyAssertionResponse.h"
+#import "FIRVerifyClientRequest.h"
+#import "FIRVerifyClientResponse.h"
+#import "FIRVerifyCustomTokenRequest.h"
+#import "FIRVerifyCustomTokenResponse.h"
+#import "FIRVerifyPasswordRequest.h"
+#import "FIRVerifyPasswordResponse.h"
+#import "FIRVerifyPhoneNumberRequest.h"
+#import "FIRVerifyPhoneNumberResponse.h"
+#import <GTMSessionFetcher/GTMSessionFetcher.h>
+#import <GTMSessionFetcher/GTMSessionFetcherService.h>
+
+/** @var kIosBundleIdentifierHeader
+ @brief HTTP header name for iOS bundle ID.
+ */
+static NSString *const kIosBundleIdentifierHeader = @"X-Ios-Bundle-Identifier";
+
+/** @var kJSONContentType
+ @brief The value of the HTTP content-type header for JSON payloads.
+ */
+static NSString *const kJSONContentType = @"application/json";
+
+/** @var kErrorDataKey
+ @brief Key for error data in NSError returned by @c GTMSessionFetcher.
+ */
+static NSString * const kErrorDataKey = @"data";
+
+/** @var kErrorKey
+ @brief The key for the "error" value in JSON responses from the server.
+ */
+static NSString *const kErrorKey = @"error";
+
+/** @var kErrorsKey
+ @brief The key for the "errors" value in JSON responses from the server.
+ */
+static NSString *const kErrorsKey = @"errors";
+
+/** @var kReasonKey
+ @brief The key for the "reason" value in JSON responses from the server.
+ */
+static NSString *const kReasonKey = @"reason";
+
+/** @var kInvalidKeyReasonValue
+ @brief The value for the "reason" key indicating an invalid API Key was received by the server.
+ */
+static NSString *const kInvalidKeyReasonValue = @"keyInvalid";
+
+/** @var kAppNotAuthorizedReasonValue
+ @brief The value for the "reason" key indicating the App is not authorized to use Firebase
+ Authentication.
+ */
+static NSString *const kAppNotAuthorizedReasonValue = @"ipRefererBlocked";
+
+/** @var kErrorMessageKey
+ @brief The key for an error's "message" value in JSON responses from the server.
+ */
+static NSString *const kErrorMessageKey = @"message";
+
+/** @var kUserNotFoundErrorMessage
+ @brief This is the error message returned when the user is not found, which means the user
+ account has been deleted given the token was once valid.
+ */
+static NSString *const kUserNotFoundErrorMessage = @"USER_NOT_FOUND";
+
+/** @var kUserDeletedErrorMessage
+ @brief This is the error message the server will respond with if the user entered an invalid
+ email address.
+ */
+static NSString *const kUserDeletedErrorMessage = @"EMAIL_NOT_FOUND";
+
+/** @var kInvalidLocalIDErrorMessage
+ @brief This is the error message the server responds with if the user local id in the id token
+ does not exit.
+ */
+static NSString *const kInvalidLocalIDErrorMessage = @"INVALID_LOCAL_ID";
+
+/** @var kUserTokenExpiredErrorMessage
+ @brief The error returned by the server if the token issue time is older than the account's
+ valid_since time.
+ */
+static NSString *const kUserTokenExpiredErrorMessage = @"TOKEN_EXPIRED";
+
+/** @var kTooManyRequestsErrorMessage
+ @brief This is the error message the server will respond with if too many requests were made to
+ a server method.
+ */
+static NSString *const kTooManyRequestsErrorMessage = @"TOO_MANY_ATTEMPTS_TRY_LATER";
+
+/** @var kInvalidTokenCustomErrorMessage
+ @brief This is the error message the server will respond with if there is a validation error
+ with the custom token.
+ */
+static NSString *const kInvalidCustomTokenErrorMessage = @"INVALID_CUSTOM_TOKEN";
+
+/** @var kCustomTokenMismatch
+ @brief This is the error message the server will respond with if the service account and API key
+ belong to different projects.
+ */
+static NSString *const kCustomTokenMismatch = @"CREDENTIAL_MISMATCH";
+
+/** @var kInvalidCredentialErrorMessage
+ @brief This is the error message the server responds with if the IDP token or requestUri is
+ invalid.
+ */
+static NSString *const kInvalidCredentialErrorMessage = @"INVALID_IDP_RESPONSE";
+
+/** @var kUserDisabledErrorMessage
+ @brief The error returned by the server if the user account is diabled.
+ */
+static NSString *const kUserDisabledErrorMessage = @"USER_DISABLED";
+
+/** @var kOperationNotAllowedErrorMessage
+ @brief This is the error message the server will respond with if Admin disables IDP specified by
+ provider.
+ */
+static NSString *const kOperationNotAllowedErrorMessage = @"OPERATION_NOT_ALLOWED";
+
+/** @var kPasswordLoginDisabledErrorMessage
+ @brief This is the error message the server responds with if password login is disabled.
+ */
+static NSString *const kPasswordLoginDisabledErrorMessage = @"PASSWORD_LOGIN_DISABLED";
+
+/** @var kEmailAlreadyInUseErrorMessage
+ @brief This is the error message the server responds with if the email address already exists.
+ */
+static NSString *const kEmailAlreadyInUseErrorMessage = @"EMAIL_EXISTS";
+
+/** @var kInvalidEmailErrorMessage
+ @brief The error returned by the server if the email is invalid.
+ */
+static NSString *const kInvalidEmailErrorMessage = @"INVALID_EMAIL";
+
+/** @var kInvalidIdentifierErrorMessage
+ @brief The error returned by the server if the identifier is invalid.
+ */
+static NSString *const kInvalidIdentifierErrorMessage = @"INVALID_IDENTIFIER";
+
+/** @var kWrongPasswordErrorMessage
+ @brief This is the error message the server will respond with if the user entered a wrong
+ password.
+ */
+static NSString *const kWrongPasswordErrorMessage = @"INVALID_PASSWORD";
+
+/** @var kCredentialTooOldErrorMessage
+ @brief This is the error message the server responds with if account change is attempted 5
+ minutes after signing in.
+ */
+static NSString *const kCredentialTooOldErrorMessage = @"CREDENTIAL_TOO_OLD_LOGIN_AGAIN";
+
+/** @var kFederatedUserIDAlreadyLinkedMessage
+ @brief This is the error message the server will respond with if the federated user ID has been
+ already linked with another account.
+ */
+static NSString *const kFederatedUserIDAlreadyLinkedMessage = @"FEDERATED_USER_ID_ALREADY_LINKED";
+
+/** @var kInvalidUserTokenErrorMessage
+ @brief This is the error message the server responds with if user's saved auth credential is
+ invalid, and the user needs to sign in again.
+ */
+static NSString *const kInvalidUserTokenErrorMessage = @"INVALID_ID_TOKEN";
+
+/** @var kWeakPasswordErrorMessagePrefix
+ @brief This is the prefix for the error message the server responds with if user's new password
+ to be set is too weak.
+ */
+static NSString *const kWeakPasswordErrorMessagePrefix = @"WEAK_PASSWORD";
+
+/** @var kExpiredActionCodeErrorMessage
+ @brief This is the error message the server will respond with if the action code is expired.
+ */
+static NSString *const kExpiredActionCodeErrorMessage = @"EXPIRED_OOB_CODE";
+
+/** @var kInvalidActionCodeErrorMessage
+ @brief This is the error message the server will respond with if the action code is invalid.
+ */
+static NSString *const kInvalidActionCodeErrorMessage = @"INVALID_OOB_CODE";
+
+/** @var kInvalidSenderEmailErrorMessage
+ @brief This is the error message the server will respond with if the sender email is invalid
+ during a "send password reset email" attempt.
+ */
+static NSString *const kInvalidSenderEmailErrorMessage = @"INVALID_SENDER";
+
+/** @var kInvalidMessagePayloadErrorMessage
+ @brief This is the error message the server will respond with if there are invalid parameters in
+ the payload during a "send password reset email" attempt.
+ */
+static NSString *const kInvalidMessagePayloadErrorMessage = @"INVALID_MESSAGE_PAYLOAD";
+
+/** @var kInvalidRecipientEmailErrorMessage
+ @brief This is the error message the server will respond with if the recipient email is invalid.
+ */
+static NSString *const kInvalidRecipientEmailErrorMessage = @"INVALID_RECIPIENT_EMAIL";
+
+/** @var kInvalidPhoneNumberErrorMessage
+ @brief This is the error message the server will respond with if an incorrectly formatted phone
+ number is provided.
+ */
+static NSString *const kInvalidPhoneNumberErrorMessage = @"INVALID_PHONE_NUMBER";
+
+/** @var kInvalidVerificationCodeErrorMessage
+ @brief This is the error message the server will respond with if an invalid verification code is
+ provided.
+ */
+static NSString *const kInvalidVerificationCodeErrorMessage = @"INVALID_CODE";
+
+/** @var kInvalidSessionInfoErrorMessage
+ @brief This is the error message the server will respond with if an invalid session info
+ (verification ID) is provided.
+ */
+static NSString *const kInvalidSessionInfoErrorMessage = @"INVALID_SESSION_INFO";
+
+/** @var kSessionExpiredErrorMessage
+ @brief This is the error message the server will respond with if the SMS code has expired before
+ it is used.
+ */
+static NSString *const kSessionExpiredErrorMessage = @"SESSION_EXPIRED";
+
+/** @var kMissingAppCredentialErrorMessage
+ @brief This is the error message the server will respond with if the APNS token is missing in a
+ verifyClient request.
+ */
+static NSString *const kMissingAppCredentialErrorMessage = @"MISSING_APP_CREDENTIAL";
+
+/** @var kMissingAppCredentialErrorMessage
+ @brief This is the error message the server will respond with if the APNS token in a
+ verifyClient request is invalid.
+ */
+static NSString *const kInvalidAppCredentialErrorMessage = @"INVALID_APP_CREDENTIAL";
+
+/** @var kQuoutaExceededErrorMessage
+ @brief This is the error message the server will respond with if the quota for SMS text messages
+ has been exceeded for the project.
+ */
+static NSString *const kQuoutaExceededErrorMessage = @"QUOTA_EXCEEDED";
+
+/** @var kAppNotVerifiedErrorMessage
+ @brief This is the error message the server will respond with if Firebase could not verify the
+ app during a phone authentication flow.
+ */
+static NSString *const kAppNotVerifiedErrorMessage = @"APP_NOT_VERIFIED";
+
+/** @var gBackendImplementation
+ @brief The singleton FIRAuthBackendImplementation instance to use.
+ */
+static id<FIRAuthBackendImplementation> gBackendImplementation;
+
+/** @class FIRAuthBackendRPCImplementation
+ @brief The default RPC-based backend implementation.
+ */
+@interface FIRAuthBackendRPCImplementation : NSObject <FIRAuthBackendImplementation>
+
+/** @property RPCIssuer
+ @brief An instance of FIRAuthBackendRPCIssuer for making RPC requests. Allows the RPC
+ requests/responses to be easily faked.
+ */
+@property(nonatomic, strong) id<FIRAuthBackendRPCIssuer> RPCIssuer;
+
+@end
+
+@implementation FIRAuthBackend
+
++ (id<FIRAuthBackendImplementation>)implementation {
+ if (!gBackendImplementation) {
+ gBackendImplementation = [[FIRAuthBackendRPCImplementation alloc] init];
+ }
+ return gBackendImplementation;
+}
+
++ (void)setBackendImplementation:(id<FIRAuthBackendImplementation>)backendImplementation {
+ gBackendImplementation = backendImplementation;
+}
+
++ (void)setDefaultBackendImplementationWithRPCIssuer:
+ (nullable id<FIRAuthBackendRPCIssuer>)RPCIssuer {
+ FIRAuthBackendRPCImplementation *defaultImplementation =
+ [[FIRAuthBackendRPCImplementation alloc] init];
+ if (RPCIssuer) {
+ defaultImplementation.RPCIssuer = RPCIssuer;
+ }
+ gBackendImplementation = defaultImplementation;
+}
+
++ (void)createAuthURI:(FIRCreateAuthURIRequest *)request
+ callback:(FIRCreateAuthURIResponseCallback)callback {
+ [[self implementation] createAuthURI:request callback:callback];
+}
+
++ (void)getAccountInfo:(FIRGetAccountInfoRequest *)request
+ callback:(FIRGetAccountInfoResponseCallback)callback {
+ [[self implementation] getAccountInfo:request callback:callback];
+}
+
++ (void)setAccountInfo:(FIRSetAccountInfoRequest *)request
+ callback:(FIRSetAccountInfoResponseCallback)callback {
+ [[self implementation] setAccountInfo:request callback:callback];
+}
+
++ (void)verifyAssertion:(FIRVerifyAssertionRequest *)request
+ callback:(FIRVerifyAssertionResponseCallback)callback {
+ [[self implementation] verifyAssertion:request callback:callback];
+}
+
++ (void)verifyCustomToken:(FIRVerifyCustomTokenRequest *)request
+ callback:(FIRVerifyCustomTokenResponseCallback)callback {
+ [[self implementation] verifyCustomToken:request callback:callback];
+}
+
++ (void)verifyPassword:(FIRVerifyPasswordRequest *)request
+ callback:(FIRVerifyPasswordResponseCallback)callback {
+ [[self implementation] verifyPassword:request callback:callback];
+}
+
++ (void)secureToken:(FIRSecureTokenRequest *)request
+ callback:(FIRSecureTokenResponseCallback)callback {
+ [[self implementation] secureToken:request callback:callback];
+}
+
++ (void)getOOBConfirmationCode:(FIRGetOOBConfirmationCodeRequest *)request
+ callback:(FIRGetOOBConfirmationCodeResponseCallback)callback {
+ [[self implementation] getOOBConfirmationCode:request callback:callback];
+}
+
++ (void)signUpNewUser:(FIRSignUpNewUserRequest *)request
+ callback:(FIRSignupNewUserCallback)callback {
+ [[self implementation] signUpNewUser:request callback:callback];
+}
+
++ (void)deleteAccount:(FIRDeleteAccountRequest *)request callback:(FIRDeleteCallBack)callback {
+ [[self implementation] deleteAccount:request callback:callback];
+}
+
++ (void)sendVerificationCode:(FIRSendVerificationCodeRequest *)request
+ callback:(FIRSendVerificationCodeResponseCallback)callback {
+ [[self implementation] sendVerificationCode:request callback:callback];
+}
+
++ (void)verifyPhoneNumber:(FIRVerifyPhoneNumberRequest *)request
+ callback:(FIRVerifyPhoneNumberResponseCallback)callback {
+ [[self implementation] verifyPhoneNumber:request callback:callback];
+}
+
++ (void)verifyClient:(id)request callback:(FIRVerifyClientResponseCallback)callback {
+ [[self implementation] verifyClient:request callback:callback];
+}
+
++ (void)resetPassword:(FIRResetPasswordRequest *)request
+ callback:(FIRResetPasswordCallback)callback {
+ [[self implementation] resetPassword:request callback:callback];
+}
+
+@end
+
+@interface FIRAuthBackendRPCIssuerImplementation : NSObject <FIRAuthBackendRPCIssuer>
+@end
+
+@implementation FIRAuthBackendRPCIssuerImplementation {
+ /** @var The session fetcher service.
+ */
+ GTMSessionFetcherService *_fetcherService;
+}
+
+- (instancetype)init {
+ self = [super init];
+ if (self) {
+ _fetcherService = [[GTMSessionFetcherService alloc] init];
+ _fetcherService.userAgent = [NSString stringWithFormat:@"FirebaseAuth.iOS/%s %@",
+ FirebaseAuthVersionString, GTMFetcherStandardUserAgentString(nil)];
+ _fetcherService.callbackQueue = FIRAuthGlobalWorkQueue();
+ }
+ return self;
+}
+
+- (void)asyncPostToURL:(NSURL *)URL
+ body:(NSData *)body
+ contentType:(NSString *)contentType
+ completionHandler:(void (^)(NSData *_Nullable, NSError *_Nullable))handler {
+ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
+ [request setValue:contentType forHTTPHeaderField:@"Content-Type"];
+ NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier];
+ [request setValue:bundleID forHTTPHeaderField:kIosBundleIdentifierHeader];
+
+ NSArray<NSString *> *preferredLocalizations = [NSBundle mainBundle].preferredLocalizations;
+ if (preferredLocalizations.count) {
+ NSString *acceptLanguage = preferredLocalizations.firstObject;
+ [request setValue:acceptLanguage forHTTPHeaderField:@"Accept-Language"];
+ }
+
+ GTMSessionFetcher* fetcher = [_fetcherService fetcherWithRequest:request];
+ fetcher.bodyData = body;
+ [fetcher beginFetchWithCompletionHandler:handler];
+}
+
+@end
+
+@implementation FIRAuthBackendRPCImplementation
+
+- (instancetype)init {
+ self = [super init];
+ if (self) {
+ _RPCIssuer = [[FIRAuthBackendRPCIssuerImplementation alloc] init];
+ }
+ return self;
+}
+
+- (void)createAuthURI:(FIRCreateAuthURIRequest *)request
+ callback:(FIRCreateAuthURIResponseCallback)callback {
+ FIRCreateAuthURIResponse *response = [[FIRCreateAuthURIResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ } else {
+ callback(response, nil);
+ }
+ }];
+}
+
+- (void)getAccountInfo:(FIRGetAccountInfoRequest *)request
+ callback:(FIRGetAccountInfoResponseCallback)callback {
+ FIRGetAccountInfoResponse *response = [[FIRGetAccountInfoResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ } else {
+ callback(response, nil);
+ }
+ }];
+}
+
+- (void)setAccountInfo:(FIRSetAccountInfoRequest *)request
+ callback:(FIRSetAccountInfoResponseCallback)callback {
+ FIRSetAccountInfoResponse *response = [[FIRSetAccountInfoResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ } else {
+ callback(response, nil);
+ }
+ }];
+}
+
+- (void)verifyAssertion:(FIRVerifyAssertionRequest *)request
+ callback:(FIRVerifyAssertionResponseCallback)callback {
+ FIRVerifyAssertionResponse *response = [[FIRVerifyAssertionResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ return;
+ }
+ callback(response, nil);
+ }];
+}
+
+- (void)verifyCustomToken:(FIRVerifyCustomTokenRequest *)request
+ callback:(FIRVerifyCustomTokenResponseCallback)callback {
+ FIRVerifyCustomTokenResponse *response = [[FIRVerifyCustomTokenResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ } else {
+ callback(response, nil);
+ }
+ }];
+}
+
+- (void)verifyPassword:(FIRVerifyPasswordRequest *)request
+ callback:(FIRVerifyPasswordResponseCallback)callback {
+ FIRVerifyPasswordResponse *response = [[FIRVerifyPasswordResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ } else {
+ callback(response, nil);
+ }
+ }];
+}
+
+- (void)secureToken:(FIRSecureTokenRequest *)request
+ callback:(FIRSecureTokenResponseCallback)callback {
+ FIRSecureTokenResponse *response = [[FIRSecureTokenResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ } else {
+ callback(response, nil);
+ }
+ }];
+}
+
+- (void)getOOBConfirmationCode:(FIRGetOOBConfirmationCodeRequest *)request
+ callback:(FIRGetOOBConfirmationCodeResponseCallback)callback {
+ FIRGetOOBConfirmationCodeResponse *response = [[FIRGetOOBConfirmationCodeResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ } else {
+ callback(response, nil);
+ }
+ }];
+}
+
+- (void)signUpNewUser:(FIRSignUpNewUserRequest *)request
+ callback:(FIRSignupNewUserCallback)callback{
+ FIRSignUpNewUserResponse *response = [[FIRSignUpNewUserResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ } else {
+ callback(response, nil);
+ }
+ }];
+}
+
+- (void)deleteAccount:(FIRDeleteAccountRequest *)request callback:(FIRDeleteCallBack)callback {
+ FIRDeleteAccountResponse *response = [[FIRDeleteAccountResponse alloc] init];
+ [self postWithRequest:request response:response callback:callback];
+}
+
+- (void)sendVerificationCode:(FIRSendVerificationCodeRequest *)request
+ callback:(FIRSendVerificationCodeResponseCallback)callback {
+ FIRSendVerificationCodeResponse *response = [[FIRSendVerificationCodeResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ } else {
+ callback(response, error);
+ }
+ }];
+}
+
+- (void)verifyPhoneNumber:(FIRVerifyPhoneNumberRequest *)request
+ callback:(FIRVerifyPhoneNumberResponseCallback)callback {
+ FIRVerifyPhoneNumberResponse *response = [[FIRVerifyPhoneNumberResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ return;
+ }
+ // Check whether or not the successful response is actually the special case phone auth flow
+ // that returns a temporary proof and phone number.
+ if (response.phoneNumber.length && response.temporaryProof.length) {
+ FIRPhoneAuthCredential *credential =
+ [[FIRPhoneAuthCredential alloc] initWithTemporaryProof:response.temporaryProof
+ phoneNumber:response.phoneNumber
+ providerID:FIRPhoneAuthProviderID];
+ callback(nil,
+ [FIRAuthErrorUtils credentialAlreadyInUseErrorWithMessage:nil
+ credential:credential]);
+ return;
+ }
+ callback(response, nil);
+ }];
+}
+
+- (void)verifyClient:(id)request callback:(FIRVerifyClientResponseCallback)callback {
+ FIRVerifyClientResponse *response = [[FIRVerifyClientResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ return;
+ }
+ callback(response, nil);
+ }];
+}
+
+- (void)resetPassword:(FIRResetPasswordRequest *)request
+ callback:(FIRResetPasswordCallback)callback {
+ FIRResetPasswordResponse *response = [[FIRResetPasswordResponse alloc] init];
+ [self postWithRequest:request response:response callback:^(NSError *error) {
+ if (error) {
+ callback(nil, error);
+ return;
+ }
+ callback(response, nil);
+ }];
+}
+
+#pragma mark - Generic RPC handling methods
+
+/** @fn postWithRequest:response:callback:
+ @brief Calls the RPC using HTTP POST.
+ @remarks Possible error responses:
+ @see FIRAuthInternalErrorCodeRPCRequestEncodingError
+ @see FIRAuthInternalErrorCodeJSONSerializationError
+ @see FIRAuthInternalErrorCodeNetworkError
+ @see FIRAuthInternalErrorCodeUnexpectedErrorResponse
+ @see FIRAuthInternalErrorCodeUnexpectedResponse
+ @see FIRAuthInternalErrorCodeRPCResponseDecodingError
+ @param request The request.
+ @param response The empty response to be filled.
+ @param callback The callback for both success and failure.
+ */
+- (void)postWithRequest:(id<FIRAuthRPCRequest>)request
+ response:(id<FIRAuthRPCResponse>)response
+ callback:(void (^)(NSError *error))callback {
+ NSError *error;
+ id postBody = [request unencodedHTTPRequestBodyWithError:&error];
+ if (!postBody) {
+ callback([FIRAuthErrorUtils RPCRequestEncodingErrorWithUnderlyingError:error]);
+ return;
+ }
+ NSJSONWritingOptions JSONWritingOptions = 0;
+ #if DEBUG
+ JSONWritingOptions |= NSJSONWritingPrettyPrinted;
+ #endif
+
+ NSData *bodyData;
+ if ([NSJSONSerialization isValidJSONObject:postBody]) {
+ bodyData = [NSJSONSerialization dataWithJSONObject:postBody
+ options:JSONWritingOptions
+ error:&error];
+ if (!bodyData) {
+ // This is an untested case. This happens exclusively when there is an error in the framework
+ // implementation of dataWithJSONObject:options:error:. This shouldn't normally occur as
+ // isValidJSONObject: should return NO in any case we should encounter an error.
+ error = [FIRAuthErrorUtils JSONSerializationErrorWithUnderlyingError:error];
+ }
+ } else {
+ error = [FIRAuthErrorUtils JSONSerializationErrorForUnencodableType];
+ }
+ if (!bodyData) {
+ callback(error);
+ return;
+ }
+
+ [_RPCIssuer asyncPostToURL:[request requestURL]
+ body:bodyData
+ contentType:kJSONContentType
+ completionHandler:^(NSData *data, NSError *error) {
+ // If there is an error with no body data at all, then this must be a network error.
+ if (error && !data) {
+ callback([FIRAuthErrorUtils networkErrorWithUnderlyingError:error]);
+ return;
+ }
+
+ // Try to decode the HTTP response data which may contain either a successful response or error
+ // message.
+ NSError *jsonError;
+ NSDictionary * dictionary =
+ [NSJSONSerialization JSONObjectWithData:data
+ options:NSJSONReadingMutableLeaves
+ error:&jsonError];
+ if (!dictionary) {
+ if (error) {
+ // We have an error, but we couldn't decode the body, so we have no additional information
+ // other than the raw response and the original NSError (the jsonError is infered by the
+ // error code (FIRAuthErrorCodeUnexpectedHTTPResponse, and is irrelevant.)
+ callback([FIRAuthErrorUtils unexpectedErrorResponseWithData:data underlyingError:error]);
+ } else {
+ // This is supposed to be a "successful" response, but we couldn't deserialize the body.
+ callback([FIRAuthErrorUtils unexpectedResponseWithData:data underlyingError:jsonError]);
+ }
+ return;
+ }
+ if (![dictionary isKindOfClass:[NSDictionary class]]) {
+ if (error) {
+ callback([FIRAuthErrorUtils unexpectedErrorResponseWithDeserializedResponse:dictionary]);
+ } else {
+ callback([FIRAuthErrorUtils unexpectedResponseWithDeserializedResponse:dictionary]);
+ }
+ return;
+ }
+
+ // At this point we either have an error with successfully decoded details in the body, or we
+ // have a response which must pass further validation before we know it's truly successful.
+ // We deal with the case where we have an error with successfully decoded error details first:
+ if (error) {
+ NSDictionary *errorDictionary = dictionary[kErrorKey];
+ if ([errorDictionary isKindOfClass:[NSDictionary class]]) {
+ id<NSObject> errorMessage = errorDictionary[kErrorMessageKey];
+ if ([errorMessage isKindOfClass:[NSString class]]) {
+ NSString *errorMessageString = (NSString *)errorMessage;
+
+ // Contruct client error.
+ NSError *clientError = [[self class] clientErrorWithServerErrorMessage:errorMessageString
+ errorDictionary:errorDictionary
+ response:response];
+ if (clientError) {
+ callback(clientError);
+ return;
+ }
+ }
+ // Not a message we know, return the message directly.
+ if (errorMessage) {
+ NSError *unexpecterErrorResponse =
+ [FIRAuthErrorUtils unexpectedErrorResponseWithDeserializedResponse:errorDictionary];
+ callback(unexpecterErrorResponse);
+ return;
+ }
+ }
+ // No error message at all, return the decoded response.
+ callback([FIRAuthErrorUtils unexpectedErrorResponseWithDeserializedResponse:dictionary]);
+ return;
+ }
+
+ // Finally, we try to populate the response object with the JSON values.
+ if (![response setWithDictionary:dictionary error:&error]) {
+ callback([FIRAuthErrorUtils RPCResponseDecodingErrorWithDeserializedResponse:dictionary
+ underlyingError:error]);
+ return;
+ }
+
+ // Success! The response object originally passed in can be used by the caller.
+ callback(nil);
+ }];
+}
+
+/** @fn clientErrorWithServerErrorMessage:errorDictionary:
+ @brief Translates known server errors to client errors.
+ @param serverErrorMessage The error message from the server.
+ @param errorDictionary The error part of the response from the server.
+ @param response The response from the server RPC.
+ @return A client error, if any.
+ */
++ (nullable NSError *)clientErrorWithServerErrorMessage:(NSString *)serverErrorMessage
+ errorDictionary:(NSDictionary *)errorDictionary
+ response:(id<FIRAuthRPCResponse>)response {
+ NSString *shortErrorMessage = serverErrorMessage;
+ NSString *serverDetailErrorMessage;
+ NSRange colonRange = [serverErrorMessage rangeOfString:@":"];
+ if (colonRange.location != NSNotFound) {
+ shortErrorMessage = [serverErrorMessage substringToIndex:colonRange.location];
+ shortErrorMessage =
+ [shortErrorMessage stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
+ serverDetailErrorMessage = [serverErrorMessage substringFromIndex:colonRange.location + 1];
+ serverDetailErrorMessage = [serverDetailErrorMessage stringByTrimmingCharactersInSet:
+ [NSCharacterSet whitespaceCharacterSet]];
+ }
+
+ // Delegate the responsibility for constructing the client error to the response object,
+ // if possible.
+ SEL clientErrorWithServerErrorMessageSelector =
+ @selector(clientErrorWithShortErrorMessage:detailErrorMessage:);
+ if ([response respondsToSelector:clientErrorWithServerErrorMessageSelector]) {
+ NSError *error = [response clientErrorWithShortErrorMessage:shortErrorMessage
+ detailErrorMessage:serverDetailErrorMessage];
+ if (error) {
+ return error;
+ }
+ }
+
+ if ([shortErrorMessage isEqualToString:kUserNotFoundErrorMessage]) {
+ return [FIRAuthErrorUtils userNotFoundErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kUserDeletedErrorMessage]) {
+ return [FIRAuthErrorUtils userNotFoundErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidLocalIDErrorMessage]) {
+ // This case shouldn't be necessary but it is for now: b/27908364 .
+ return [FIRAuthErrorUtils userNotFoundErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kUserTokenExpiredErrorMessage]) {
+ return [FIRAuthErrorUtils userTokenExpiredErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kTooManyRequestsErrorMessage]) {
+ return [FIRAuthErrorUtils tooManyRequestsErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidCustomTokenErrorMessage]) {
+ return [FIRAuthErrorUtils invalidCustomTokenErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kCustomTokenMismatch]) {
+ return [FIRAuthErrorUtils customTokenMistmatchErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidCredentialErrorMessage]) {
+ return [FIRAuthErrorUtils invalidCredentialErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kUserDisabledErrorMessage]) {
+ return [FIRAuthErrorUtils userDisabledErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kOperationNotAllowedErrorMessage]) {
+ return [FIRAuthErrorUtils operationNotAllowedErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kPasswordLoginDisabledErrorMessage]) {
+ return [FIRAuthErrorUtils operationNotAllowedErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kEmailAlreadyInUseErrorMessage]) {
+ return [FIRAuthErrorUtils emailAlreadyInUseErrorWithEmail:nil];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidEmailErrorMessage]) {
+ return [FIRAuthErrorUtils invalidEmailErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ // "INVALID_IDENTIFIER" can be returned by createAuthURI RPC. Considering email addresses are
+ // currently the only identifiers, we surface the FIRAuthErrorCodeInvalidEmail error code in this
+ // case.
+ if ([shortErrorMessage isEqualToString:kInvalidIdentifierErrorMessage]) {
+ return [FIRAuthErrorUtils invalidEmailErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kWrongPasswordErrorMessage]) {
+ return [FIRAuthErrorUtils wrongPasswordErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kCredentialTooOldErrorMessage]) {
+ return [FIRAuthErrorUtils requiresRecentLoginErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidUserTokenErrorMessage]) {
+ return [FIRAuthErrorUtils invalidUserTokenErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kFederatedUserIDAlreadyLinkedMessage]) {
+ return [FIRAuthErrorUtils credentialAlreadyInUseErrorWithMessage:serverDetailErrorMessage
+ credential:nil];
+ }
+
+ if ([shortErrorMessage isEqualToString:kWeakPasswordErrorMessagePrefix]) {
+ return [FIRAuthErrorUtils weakPasswordErrorWithServerResponseReason:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kExpiredActionCodeErrorMessage]) {
+ return [FIRAuthErrorUtils expiredActionCodeErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidActionCodeErrorMessage]) {
+ return [FIRAuthErrorUtils invalidActionCodeErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidSenderEmailErrorMessage]) {
+ return [FIRAuthErrorUtils invalidSenderErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidMessagePayloadErrorMessage]) {
+ return [FIRAuthErrorUtils invalidMessagePayloadErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidRecipientEmailErrorMessage]) {
+ return [FIRAuthErrorUtils invalidRecipientEmailErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidPhoneNumberErrorMessage]) {
+ return [FIRAuthErrorUtils invalidPhoneNumberErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidSessionInfoErrorMessage]) {
+ return [FIRAuthErrorUtils invalidVerificationIDErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidVerificationCodeErrorMessage]) {
+ return [FIRAuthErrorUtils invalidVerificationCodeErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kSessionExpiredErrorMessage]) {
+ return [FIRAuthErrorUtils sessionExpiredErrorWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kMissingAppCredentialErrorMessage]) {
+ return [FIRAuthErrorUtils missingAppCredentialWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kInvalidAppCredentialErrorMessage]) {
+ return [FIRAuthErrorUtils invalidAppCredentialWithMessage:serverDetailErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kQuoutaExceededErrorMessage]) {
+ return [FIRAuthErrorUtils quotaExceededErrorWithMessage:serverErrorMessage];
+ }
+
+ if ([shortErrorMessage isEqualToString:kAppNotVerifiedErrorMessage]) {
+ return [FIRAuthErrorUtils appNotVerifiedErrorWithMessage:serverErrorMessage];
+ }
+
+ // In this case we handle an error that might be specified in the underlying errors dictionary,
+ // the error message in determined based on the @c reason key in the dictionary.
+ if (errorDictionary[kErrorsKey]) {
+ // Check for underlying error with reason = keyInvalid;
+ id underlyingErrors = errorDictionary[kErrorsKey];
+ if ([underlyingErrors isKindOfClass:[NSArray class]]) {
+ NSArray *underlyingErrorsArray = (NSArray *)underlyingErrors;
+ for (id underlyingError in underlyingErrorsArray) {
+ if ([underlyingError isKindOfClass:[NSDictionary class]]) {
+ NSDictionary *underlyingErrorDictionary = (NSDictionary *)underlyingError;
+ NSString *reason = underlyingErrorDictionary[kReasonKey];
+ if ([reason hasPrefix:kInvalidKeyReasonValue]) {
+ return [FIRAuthErrorUtils invalidAPIKeyError];
+ }
+ if ([reason isEqualToString:kAppNotAuthorizedReasonValue]) {
+ return [FIRAuthErrorUtils appNotAuthorizedError];
+ }
+ }
+ }
+ }
+ }
+ return nil;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRAuthRPCRequest.h b/Firebase/Auth/Source/RPCs/FIRAuthRPCRequest.h
new file mode 100644
index 0000000..ddad3cb
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRAuthRPCRequest.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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
+
+/** @protocol FIRAuthRPCRequest
+ @brief The generic interface for an RPC request needed by @c FIRAuthBackend.
+ */
+@protocol FIRAuthRPCRequest <NSObject>
+
+/** @fn requestURL
+ @brief Gets the request's full URL.
+ */
+- (NSURL *)requestURL;
+
+/** @fn UnencodedHTTPRequestBodyWithError:
+ @brief Creates unencoded HTTP body representing the request.
+ @param error An out field for an error which occurred constructing the request.
+ @return The HTTP body data representing the request before any encoding, or nil for error.
+ */
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRAuthRPCResponse.h b/Firebase/Auth/Source/RPCs/FIRAuthRPCResponse.h
new file mode 100644
index 0000000..c130f3f
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRAuthRPCResponse.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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
+
+/** @protocol FIRAuthRPCResponse
+ @brief The generic interface for an RPC response needed by @c FIRAuthBackend.
+ */
+@protocol FIRAuthRPCResponse <NSObject>
+
+/** @fn setFieldsWithDictionary:error:
+ @brief Sets the response instance from the decoded JSON response.
+ @param dictionary The dictionary decoded from HTTP JSON response.
+ @param error An out field for an error which occurred constructing the request.
+ @return Whether the operation was successful or not.
+ */
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error;
+
+@optional
+
+/** @fn clientErrorWithshortErrorMessage:detailErrorMessage
+ @brief This optional method allows response classes to create client errors given a short error
+ message and a detail error message from the server.
+ @param shortErrorMessage The short error message from the server.
+ @param detailErrorMessage The detailed error message from the server.
+ @return A client error, if any.
+ */
+- (nullable NSError *)clientErrorWithShortErrorMessage:(NSString *)shortErrorMessage
+ detailErrorMessage:(NSString *)detailErrorMessage;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRCreateAuthURIRequest.h b/Firebase/Auth/Source/RPCs/FIRCreateAuthURIRequest.h
new file mode 100644
index 0000000..bb28826
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRCreateAuthURIRequest.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCRequest.h"
+#import "FIRIdentityToolkitRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRCreateAuthURIRequest
+ @brief Represents the parameters for the createAuthUri endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/createAuthUri
+ */
+@interface FIRCreateAuthURIRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property identifier
+ @brief The email or federated ID of the user.
+ */
+@property(nonatomic, copy) NSString *identifier;
+
+/** @property continueURI
+ @brief The URI to which the IDP redirects the user after the federated login flow.
+ */
+@property(nonatomic, copy) NSString *continueURI;
+
+/** @property openIDRealm
+ @brief Optional realm for OpenID protocol. The sub string "scheme://domain:port" of the param
+ "continueUri" is used if this is not set.
+ */
+@property(nonatomic, copy, nullable) NSString *openIDRealm;
+
+/** @property providerID
+ @brief The IdP ID. For white listed IdPs it's a short domain name e.g. google.com, aol.com,
+ live.net and yahoo.com. For other OpenID IdPs it's the OP identifier.
+ */
+@property(nonatomic, copy, nullable) NSString *providerID;
+
+/** @property clientID
+ @brief The relying party OAuth client ID.
+ */
+@property(nonatomic, copy, nullable) NSString *clientID;
+
+/** @property context
+ @brief The opaque value used by the client to maintain context info between the authentication
+ request and the IDP callback.
+ */
+@property(nonatomic, copy, nullable) NSString *context;
+
+/** @property appID
+ @brief The iOS client application's bundle identifier.
+ */
+@property(nonatomic, copy, nullable) NSString *appID;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithIdentifier:continueURI:APIKey:
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+/** @fn initWithIdentifier:continueURI:APIKey:
+ @brief Designated initializer.
+ @param identifier The email or federated ID of the user.
+ @param continueURI The URI to which the IDP redirects the user after the federated login flow.
+ @param APIKey The client's API Key.
+ */
+- (nullable instancetype)initWithIdentifier:(NSString *)identifier
+ continueURI:(NSString *)continueURI
+ APIKey:(NSString *)APIKey NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRCreateAuthURIRequest.m b/Firebase/Auth/Source/RPCs/FIRCreateAuthURIRequest.m
new file mode 100644
index 0000000..6d2b9e9
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRCreateAuthURIRequest.m
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRCreateAuthURIRequest.h"
+
+/** @var kCreateAuthURIEndpoint
+ @brief The "createAuthUri" endpoint.
+ */
+static NSString *const kCreateAuthURIEndpoint = @"createAuthUri";
+
+/** @var kProviderIDKey
+ @brief The key for the "providerId" value in the request.
+ */
+static NSString *const kProviderIDKey = @"providerId";
+
+/** @var kIdentifierKey
+ @brief The key for the "identifier" value in the request.
+ */
+static NSString *const kIdentifierKey = @"identifier";
+
+/** @var kContinueURIKey
+ @brief The key for the "continueUri" value in the request.
+ */
+static NSString *const kContinueURIKey = @"continueUri";
+
+/** @var kOpenIDRealmKey
+ @brief The key for the "openidRealm" value in the request.
+ */
+static NSString *const kOpenIDRealmKey = @"openidRealm";
+
+/** @var kClientIDKey
+ @brief The key for the "clientId" value in the request.
+ */
+static NSString *const kClientIDKey = @"clientId";
+
+/** @var kContextKey
+ @brief The key for the "context" value in the request.
+ */
+static NSString *const kContextKey = @"context";
+
+/** @var kAppIDKey
+ @brief The key for the "appId" value in the request.
+ */
+static NSString *const kAppIDKey = @"appId";
+
+@implementation FIRCreateAuthURIRequest
+
+- (nullable instancetype)initWithIdentifier:(NSString *)identifier
+ continueURI:(NSString *)continueURI
+ APIKey:(NSString *)APIKey {
+ self = [super initWithEndpoint:kCreateAuthURIEndpoint APIKey:APIKey];
+ if (self) {
+ _identifier = [identifier copy];
+ _continueURI = [continueURI copy];
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ NSMutableDictionary *postBody = [@{
+ kIdentifierKey : _identifier,
+ kContinueURIKey : _continueURI
+ } mutableCopy];
+ if (_providerID) {
+ postBody[kProviderIDKey] = _providerID;
+ }
+ if (_openIDRealm) {
+ postBody[kOpenIDRealmKey] = _openIDRealm;
+ }
+ if (_clientID) {
+ postBody[kClientIDKey] = _clientID;
+ }
+ if (_context) {
+ postBody[kContextKey] = _context;
+ }
+ if (_appID) {
+ postBody[kAppIDKey] = _appID;
+ }
+ return postBody;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRCreateAuthURIResponse.h b/Firebase/Auth/Source/RPCs/FIRCreateAuthURIResponse.h
new file mode 100644
index 0000000..9f6cbae
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRCreateAuthURIResponse.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRCreateAuthURIResponse
+ @brief Represents the parameters for the createAuthUri endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/createAuthUri
+ */
+@interface FIRCreateAuthURIResponse : NSObject <FIRAuthRPCResponse>
+
+/** @property authUri
+ @brief The URI used by the IDP to authenticate the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *authURI;
+
+/** @property registered
+ @brief Whether the user is registered if the identifier is an email.
+ */
+@property(nonatomic, assign, readonly) BOOL registered;
+
+/** @property providerId
+ @brief The provider ID of the auth URI.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *providerID;
+
+/** @property forExistingProvider
+ @brief True if the authUri is for user's existing provider.
+ */
+@property(nonatomic, assign, readonly) BOOL forExistingProvider;
+
+/** @property allProviders
+ @brief A list of provider IDs the passed @c identifier could use to sign in with.
+ */
+@property(nonatomic, copy, readonly, nullable) NSArray<NSString *> *allProviders;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRCreateAuthURIResponse.m b/Firebase/Auth/Source/RPCs/FIRCreateAuthURIResponse.m
new file mode 100644
index 0000000..7a38cca
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRCreateAuthURIResponse.m
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRCreateAuthURIResponse.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+
+@implementation FIRCreateAuthURIResponse
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _providerID = [dictionary[@"providerId"] copy];
+ _authURI = [dictionary[@"authUri"] copy];
+ _registered = [dictionary[@"registered"] boolValue];
+ _forExistingProvider = [dictionary[@"forExistingProvider"] boolValue];
+ _allProviders = [dictionary[@"allProviders"] copy];
+ return YES;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRDeleteAccountRequest.h b/Firebase/Auth/Source/RPCs/FIRDeleteAccountRequest.h
new file mode 100644
index 0000000..1751e54
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRDeleteAccountRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCRequest.h"
+#import "FIRIdentityToolkitRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRDeleteAccountRequest
+ @brief Represents the parameters for the deleteAccount endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/deleteAccount
+ */
+@interface FIRDeleteAccountRequest : FIRIdentityToolkitRequest<FIRAuthRPCRequest>
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithAPIKey:
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+/** @fn initWithAPIKey:
+ @brief Designated initializer.
+ @param APIKey The client's API Key.
+ @param localID The local ID.
+ @param accessToken The access token.
+ */
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey
+ localID:(NSString *)localID
+ accessToken:(NSString *)accessToken NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRDeleteAccountRequest.m b/Firebase/Auth/Source/RPCs/FIRDeleteAccountRequest.m
new file mode 100644
index 0000000..9105ba0
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRDeleteAccountRequest.m
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRDeleteAccountRequest.h"
+
+/** @var kCreateAuthURIEndpoint
+ @brief The "deleteAccount" endpoint.
+ */
+static NSString *const kDeleteAccountEndpoint = @"deleteAccount";
+
+/** @var kIDTokenKey
+ @brief The key for the "idToken" value in the request. This is actually the STS Access Token,
+ despite it's confusing (backwards compatiable) parameter name.
+ */
+static NSString *const kIDTokenKey = @"idToken";
+
+/** @var kLocalIDKey
+ @brief The key for the "localID" value in the request.
+ */
+static NSString *const kLocalIDKey = @"localId";
+
+@implementation FIRDeleteAccountRequest {
+ /** @var _accessToken
+ @brief The STS Access Token of the authenticated user.
+ */
+ NSString *_accessToken;
+
+ /** @var _localID
+ @brief The localID of the user.
+ */
+ NSString *_localID;
+}
+
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey
+ localID:(nonnull NSString *)localID
+ accessToken:(nonnull NSString *)accessToken {
+ self = [super initWithEndpoint:kDeleteAccountEndpoint APIKey:APIKey];
+ if (self) {
+ _localID = [localID copy];
+ _accessToken = [accessToken copy];
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ NSMutableDictionary *postBody = [NSMutableDictionary dictionary];
+ postBody[kIDTokenKey] = _accessToken;
+ postBody[kLocalIDKey] = _localID;
+ return postBody;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRDeleteAccountResponse.h b/Firebase/Auth/Source/RPCs/FIRDeleteAccountResponse.h
new file mode 100644
index 0000000..59226d6
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRDeleteAccountResponse.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+/** @class FIRDeleteAccountResponse
+ @brief Represents the response from the deleteAccount endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/deleteAccount
+ */
+@interface FIRDeleteAccountResponse : NSObject<FIRAuthRPCResponse>
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRDeleteAccountResponse.m b/Firebase/Auth/Source/RPCs/FIRDeleteAccountResponse.m
new file mode 100644
index 0000000..01eb0a5
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRDeleteAccountResponse.m
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRDeleteAccountResponse.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+
+@implementation FIRDeleteAccountResponse
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ return YES;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRGetAccountInfoRequest.h b/Firebase/Auth/Source/RPCs/FIRGetAccountInfoRequest.h
new file mode 100644
index 0000000..b45b933
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRGetAccountInfoRequest.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCRequest.h"
+#import "FIRIdentityToolkitRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRGetAccountInfoRequest
+ @brief Represents the parameters for the getAccountInfo endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/getAccountInfo
+ */
+@interface FIRGetAccountInfoRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property accessToken
+ @brief The STS Access Token for the authenticated user.
+ */
+@property(nonatomic, copy) NSString *accessToken;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithAPIKey:IDToken:
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+/** @fn initWithAPIKey:accessToken:
+ @brief Designated initializer.
+ @param APIKey The client's API Key.
+ @param accessToken The Access Token of the authenticated user.
+ */
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey
+ accessToken:(NSString *)accessToken NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRGetAccountInfoRequest.m b/Firebase/Auth/Source/RPCs/FIRGetAccountInfoRequest.m
new file mode 100644
index 0000000..5c73086
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRGetAccountInfoRequest.m
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRGetAccountInfoRequest.h"
+
+/** @var kGetAccountInfoEndpoint
+ @brief The "getAccountInfo" endpoint.
+ */
+static NSString *const kGetAccountInfoEndpoint = @"getAccountInfo";
+
+/** @var kIDTokenKey
+ @brief The key for the "idToken" value in the request. This is actually the STS Access Token,
+ despite it's confusing (backwards compatiable) parameter name.
+ */
+static NSString *const kIDTokenKey = @"idToken";
+
+@implementation FIRGetAccountInfoRequest
+
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey
+ accessToken:(NSString *)accessToken {
+ self = [super initWithEndpoint:kGetAccountInfoEndpoint APIKey:APIKey];
+ if (self) {
+ _accessToken = [accessToken copy];
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ return @{
+ kIDTokenKey : _accessToken
+ };
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRGetAccountInfoResponse.h b/Firebase/Auth/Source/RPCs/FIRGetAccountInfoResponse.h
new file mode 100644
index 0000000..009f3c1
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRGetAccountInfoResponse.h
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRGetAccountInfoResponseProviderUserInfo
+ @brief Represents the provider user info part of the response from the getAccountInfo endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/getAccountInfo
+ */
+@interface FIRGetAccountInfoResponseProviderUserInfo : NSObject
+
+/** @property providerID
+ @brief The ID of the identity provider.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *providerID;
+
+/** @property displayName
+ @brief The user's display name at the identity provider.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *displayName;
+
+/** @property photoURL
+ @brief The user's photo URL at the identity provider.
+ */
+@property(nonatomic, strong, readonly, nullable) NSURL *photoURL;
+
+/** @property federatedID
+ @brief The user's identifier at the identity provider.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *federatedID;
+
+/** @property email
+ @brief The user's email at the identity provider.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *email;
+
+/** @property phoneNumber
+ @brief A phone number associated with the user.
+ */
+@property(nonatomic, readonly, nullable) NSString *phoneNumber;
+
+/** @fn init
+ @brief Please use initWithDictionary:
+ */
+- (instancetype)init NS_UNAVAILABLE;
+
+/** @fn initWithAPIKey:
+ @brief Designated initializer.
+ @param dictionary The provider user info data from endpoint.
+ */
+- (instancetype)initWithDictionary:(NSDictionary *)dictionary NS_DESIGNATED_INITIALIZER;
+
+@end
+
+/** @class FIRGetAccountInfoResponseUser
+ @brief Represents the firebase user info part of the response from the getAccountInfo endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/getAccountInfo
+ */
+@interface FIRGetAccountInfoResponseUser : NSObject
+
+/** @property localID
+ @brief The ID of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *localID;
+
+/** @property email
+ @brief The email or the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *email;
+
+/** @property emailVerified
+ @brief Whether the email has been verified.
+ */
+@property(nonatomic, assign, readonly) BOOL emailVerified;
+
+/** @property displayName
+ @brief The display name of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *displayName;
+
+/** @property photoURL
+ @brief The user's photo URL.
+ */
+@property(nonatomic, strong, readonly, nullable) NSURL *photoURL;
+
+/** @property providerUserInfo
+ @brief The user's profiles at the associated identity providers.
+ */
+@property(nonatomic, strong, readonly, nullable)
+ NSArray<FIRGetAccountInfoResponseProviderUserInfo *> *providerUserInfo;
+
+/** @property passwordHash
+ @brief Information about user's password.
+ @remarks This is not necessarily the hash of user's actual password.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *passwordHash;
+
+/** @property phoneNumber
+ @brief A phone number associated with the user.
+ */
+@property(nonatomic, readonly, nullable) NSString *phoneNumber;
+
+/** @fn init
+ @brief Please use initWithDictionary:
+ */
+- (instancetype)init NS_UNAVAILABLE;
+
+/** @fn initWithAPIKey:
+ @brief Designated initializer.
+ @param dictionary The provider user info data from endpoint.
+ */
+- (instancetype)initWithDictionary:(NSDictionary *)dictionary NS_DESIGNATED_INITIALIZER;
+
+@end
+
+/** @class FIRGetAccountInfoResponse
+ @brief Represents the response from the setAccountInfo endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/getAccountInfo
+ */
+@interface FIRGetAccountInfoResponse : NSObject <FIRAuthRPCResponse>
+
+/** @property providerUserInfo
+ @brief The requested users' profiles.
+ */
+@property(nonatomic, strong, readonly, nullable) NSArray<FIRGetAccountInfoResponseUser *> *users;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRGetAccountInfoResponse.m b/Firebase/Auth/Source/RPCs/FIRGetAccountInfoResponse.m
new file mode 100644
index 0000000..ba10746
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRGetAccountInfoResponse.m
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRGetAccountInfoResponse.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+
+/** @var kErrorKey
+ @brief The key for the "error" value in JSON responses from the server.
+ */
+static NSString *const kErrorKey = @"error";
+
+@implementation FIRGetAccountInfoResponseProviderUserInfo
+
+- (instancetype)initWithDictionary:(NSDictionary *)dictionary {
+ self = [super init];
+ if (self) {
+ _providerID = [dictionary[@"providerId"] copy];
+ _displayName = [dictionary[@"displayName"] copy];
+ NSString *photoURL = dictionary[@"photoUrl"];
+ if (photoURL) {
+ _photoURL = [NSURL URLWithString:photoURL];
+ }
+ _federatedID = [dictionary[@"federatedId"] copy];
+ _email = [dictionary[@"email"] copy];
+ _phoneNumber = [dictionary[@"phoneNumber"] copy];
+ }
+ return self;
+}
+
+@end
+
+@implementation FIRGetAccountInfoResponseUser
+
+- (instancetype)initWithDictionary:(NSDictionary *)dictionary {
+ self = [super init];
+ if (self) {
+ NSArray<NSDictionary *> *providerUserInfoData = dictionary[@"providerUserInfo"];
+ if (providerUserInfoData) {
+ NSMutableArray<FIRGetAccountInfoResponseProviderUserInfo *> *providerUserInfoArray =
+ [NSMutableArray arrayWithCapacity:providerUserInfoData.count];
+ for (NSDictionary *dictionary in providerUserInfoData) {
+ [providerUserInfoArray addObject:
+ [[FIRGetAccountInfoResponseProviderUserInfo alloc] initWithDictionary:dictionary]];
+ }
+ _providerUserInfo = [providerUserInfoArray copy];
+ }
+ _localID = [dictionary[@"localId"] copy];
+ _displayName = [dictionary[@"displayName"] copy];
+ _email = [dictionary[@"email"] copy];
+ NSString *photoURL = dictionary[@"photoUrl"];
+ if (photoURL) {
+ _photoURL = [NSURL URLWithString:photoURL];
+ }
+ _emailVerified = [dictionary[@"emailVerified"] boolValue];
+ _passwordHash = [dictionary[@"passwordHash"] copy];
+ _phoneNumber = [dictionary[@"phoneNumber"] copy];
+ }
+ return self;
+}
+
+@end
+
+@implementation FIRGetAccountInfoResponse
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ NSArray<NSDictionary *> *usersData = dictionary[@"users"];
+ // The client side never sends a getAccountInfo request with multiple localID, so only one user
+ // data is expected in the response.
+ if (![usersData isKindOfClass:[NSArray class]] || usersData.count != 1) {
+ if (error) {
+ *error = [FIRAuthErrorUtils unexpectedResponseWithDeserializedResponse:dictionary];
+ }
+ return NO;
+ }
+ _users = @[ [[FIRGetAccountInfoResponseUser alloc] initWithDictionary:usersData.firstObject] ];
+ return YES;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeRequest.h b/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeRequest.h
new file mode 100644
index 0000000..08ab495
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeRequest.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCRequest.h"
+#import "FIRIdentityToolkitRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @enum FIRGetOOBConfirmationCodeRequestType
+ @brief Types of OOB Confirmation Code requests.
+ */
+typedef NS_ENUM(NSInteger, FIRGetOOBConfirmationCodeRequestType) {
+ /** @var FIRGetOOBConfirmationCodeRequestTypePasswordReset
+ @brief Requests a password reset code.
+ */
+ FIRGetOOBConfirmationCodeRequestTypePasswordReset,
+
+ /** @var FIRGetOOBConfirmationCodeRequestTypeVerifyEmail
+ @brief Requests an email verification code.
+ */
+ FIRGetOOBConfirmationCodeRequestTypeVerifyEmail,
+};
+
+/** @enum FIRGetOOBConfirmationCodeRequest
+ @brief Represents the parameters for the getOOBConfirmationCode endpoint.
+ */
+@interface FIRGetOOBConfirmationCodeRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property requestType
+ @brief The types of OOB Confirmation Code to request.
+ */
+@property(nonatomic, assign, readonly) FIRGetOOBConfirmationCodeRequestType requestType;
+
+/** @property email
+ @brief The email of the user.
+ @remarks For password reset.
+ */
+@property(nonatomic, copy, nullable, readonly) NSString *email;
+
+/** @property accessToken
+ @brief The STS Access Token of the authenticated user.
+ @remarks For email change.
+ */
+@property(nonatomic, copy, nullable, readonly) NSString *accessToken;
+
+/** @fn passwordResetRequestWithEmail:APIKey:
+ @brief Creates a password reset request.
+ @param email The user's email address.
+ @param APIKey The client's API Key.
+ @return A password reset request.
+ */
++ (nullable FIRGetOOBConfirmationCodeRequest *)passwordResetRequestWithEmail:(NSString *)email
+ APIKey:(NSString *)APIKey;
+
+/** @fn verifyEmailRequestWithAccessToken:APIKey:
+ @brief Creates a password reset request.
+ @param accessToken The user's STS Access Token.
+ @param APIKey The client's API Key.
+ @return A password reset request.
+ */
++ (nullable FIRGetOOBConfirmationCodeRequest *)
+ verifyEmailRequestWithAccessToken:(NSString *)accessToken APIKey:(NSString *)APIKey;
+
+/** @fn init
+ @brief Please use a factory method.
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeRequest.m b/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeRequest.m
new file mode 100644
index 0000000..b0523e4
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeRequest.m
@@ -0,0 +1,135 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRGetOOBConfirmationCodeRequest.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+#import "../Private/FIRAuth_Internal.h"
+
+/** @var kEndpoint
+ @brief The getOobConfirmationCode endpoint name.
+ */
+static NSString *const kEndpoint = @"getOobConfirmationCode";
+
+/** @var kRequestTypeKey
+ @brief The name of the required "requestType" property in the request.
+ */
+static NSString *const kRequestTypeKey = @"requestType";
+
+/** @var kEmailKey
+ @brief The name of the "email" property in the request.
+ */
+static NSString *const kEmailKey = @"email";
+
+/** @var kIDTokenKey
+ @brief The key for the "idToken" value in the request. This is actually the STS Access Token,
+ despite it's confusing (backwards compatiable) parameter name.
+ */
+static NSString *const kIDTokenKey = @"idToken";
+
+/** @var kPasswordResetRequestTypeValue
+ @brief The value for the "PASSWORD_RESET" request type.
+ */
+static NSString *const kPasswordResetRequestTypeValue = @"PASSWORD_RESET";
+
+/** @var kVerifyEmailRequestTypeValue
+ @brief The value for the "VERIFY_EMAIL" request type.
+ */
+static NSString *const kVerifyEmailRequestTypeValue = @"VERIFY_EMAIL";
+
+@interface FIRGetOOBConfirmationCodeRequest ()
+
+/** @fn initWithRequestType:email:APIKey:
+ @brief Designated initializer.
+ @param requestType The types of OOB Confirmation Code to request.
+ @param email The email of the user.
+ @param accessToken The STS Access Token of the currently signed in user.
+ @param APIKey The client's API Key.
+ */
+- (nullable instancetype)initWithRequestType:(FIRGetOOBConfirmationCodeRequestType)requestType
+ email:(nullable NSString *)email
+ accessToken:(nullable NSString *)accessToken
+ APIKey:(nullable NSString *)APIKey
+ NS_DESIGNATED_INITIALIZER;
+
+@end
+
+@implementation FIRGetOOBConfirmationCodeRequest
+
+/** @var requestTypeStringValueForRequestType:
+ @brief Returns the string equivilent for an @c FIRGetOOBConfirmationCodeRequestType value.
+ */
++ (NSString *)requestTypeStringValueForRequestType:
+ (FIRGetOOBConfirmationCodeRequestType)requestType {
+ switch (requestType) {
+ case FIRGetOOBConfirmationCodeRequestTypePasswordReset:
+ return kPasswordResetRequestTypeValue;
+ case FIRGetOOBConfirmationCodeRequestTypeVerifyEmail:
+ return kVerifyEmailRequestTypeValue;
+ // No default case so that we get a compiler warning if a new value was added to the enum.
+ }
+}
+
++ (FIRGetOOBConfirmationCodeRequest *)passwordResetRequestWithEmail:(NSString *)email
+ APIKey:(NSString *)APIKey {
+ return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypePasswordReset
+ email:email
+ accessToken:nil
+ APIKey:APIKey];
+}
+
++ (FIRGetOOBConfirmationCodeRequest *)
+ verifyEmailRequestWithAccessToken:(NSString *)accessToken APIKey:(NSString *)APIKey {
+ return [[self alloc] initWithRequestType:FIRGetOOBConfirmationCodeRequestTypeVerifyEmail
+ email:nil
+ accessToken:accessToken
+ APIKey:APIKey];
+}
+
+- (nullable instancetype)initWithRequestType:(FIRGetOOBConfirmationCodeRequestType)requestType
+ email:(nullable NSString *)email
+ accessToken:(nullable NSString *)accessToken
+ APIKey:(nullable NSString *)APIKey {
+ self = [super initWithEndpoint:kEndpoint APIKey:APIKey];
+ if (self) {
+ _requestType = requestType;
+ _email = email;
+ _accessToken = accessToken;
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ NSMutableDictionary *body = [@{
+ kRequestTypeKey : [[self class] requestTypeStringValueForRequestType:_requestType]
+ } mutableCopy];
+
+ // For password reset requests, we only need an email address in addition to the already required
+ // fields.
+ if (_requestType == FIRGetOOBConfirmationCodeRequestTypePasswordReset) {
+ body[kEmailKey] = _email;
+ }
+
+ // For verify email requests, we only need an STS Access Token in addition to the already required
+ // fields.
+ if (_requestType == FIRGetOOBConfirmationCodeRequestTypeVerifyEmail) {
+ body[kIDTokenKey] = _accessToken;
+ }
+
+ return body;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeResponse.h b/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeResponse.h
new file mode 100644
index 0000000..69aa458
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeResponse.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRGetOOBConfirmationCodeResponse
+ @brief Represents the response from the getOobConfirmationCode endpoint.
+ */
+@interface FIRGetOOBConfirmationCodeResponse : NSObject <FIRAuthRPCResponse>
+
+/** @property OOBCode
+ @brief The OOB code returned by the server in some cases.
+ */
+@property(nonatomic, copy, readonly, nullable) NSString *OOBCode;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeResponse.m b/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeResponse.m
new file mode 100644
index 0000000..d5fc1dd
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRGetOOBConfirmationCodeResponse.m
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRGetOOBConfirmationCodeResponse.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @var kOOBCodeKey
+ @brief The name of the field in the response JSON for the OOB code.
+ */
+static NSString *const kOOBCodeKey = @"oobCode";
+
+@implementation FIRGetOOBConfirmationCodeResponse
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _OOBCode = [dictionary[kOOBCodeKey] copy];
+ return YES;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRIdentityToolkitRequest.h b/Firebase/Auth/Source/RPCs/FIRIdentityToolkitRequest.h
new file mode 100644
index 0000000..873788d
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRIdentityToolkitRequest.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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
+
+/** @class FIRIdentityToolkitRequest
+ @brief Represents a request to an identity toolkit endpoint.
+ */
+@interface FIRIdentityToolkitRequest : NSObject
+
+/** @property endpoint
+ @brief Gets the RPC's endpoint.
+ */
+@property(nonatomic, copy, readonly) NSString *endpoint;
+
+/** @property APIKey
+ @brief Gets the client's API key used for the request.
+ */
+@property(nonatomic, copy, readonly) NSString *APIKey;
+
+/** @fn init
+ @brief Please use initWithEndpoint:APIKey:
+ */
+- (instancetype)init NS_UNAVAILABLE;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Designated initializer.
+ @param endpoint The endpoint name.
+ @param APIKey The client's API Key.
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey
+ NS_DESIGNATED_INITIALIZER;
+
+/** @fn requestURL
+ @brief Gets the request's full URL.
+ */
+- (NSURL *)requestURL;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRIdentityToolkitRequest.m b/Firebase/Auth/Source/RPCs/FIRIdentityToolkitRequest.m
new file mode 100644
index 0000000..fb51a82
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRIdentityToolkitRequest.m
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRIdentityToolkitRequest.h"
+
+/** @var kAPIURLFormat
+ @brief URL format for server API calls.
+ */
+static NSString *const kAPIURLFormat = @"https://%@/identitytoolkit/v3/relyingparty/%@?key=%@";
+
+/** @var gAPIHost
+ @brief Host for server API calls.
+ */
+static NSString *gAPIHost = @"www.googleapis.com";
+
+@implementation FIRIdentityToolkitRequest
+
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey {
+ self = [super init];
+ if (self) {
+ _endpoint = [endpoint copy];
+ _APIKey = [APIKey copy];
+ }
+ return self;
+}
+
+- (NSURL *)requestURL {
+ NSString *URLString = [NSString stringWithFormat:kAPIURLFormat, gAPIHost, _endpoint, _APIKey];
+ NSURL *URL = [NSURL URLWithString:URLString];
+ return URL;
+}
+
+#pragma mark - Internal API for development
+
++ (NSString *)host {
+ return gAPIHost;
+}
+
++ (void)setHost:(NSString *)host {
+ gAPIHost = host;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRResetPasswordRequest.h b/Firebase/Auth/Source/RPCs/FIRResetPasswordRequest.h
new file mode 100644
index 0000000..66b03ad
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRResetPasswordRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCRequest.h"
+#import "FIRIdentityToolkitRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FIRResetPasswordRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property oobCode
+ @brief The oobCode sent in the request.
+ */
+@property(nonatomic, copy, readonly) NSString *oobCode;
+
+/** @property updatedPassword
+ @brief The new password sent in the request.
+ */
+@property(nonatomic, copy, readonly) NSString *updatedPassword;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithOOBCode:oobCode: instead.
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+/** @fn initWithAPIKey:oobCode:currentPassword:
+ @brief Designated initializer.
+ @param APIKey The client's API Key.
+ @param oobCode The OOB Code.
+ @param newPassword The new password.
+ */
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey
+ oobCode:(NSString *)oobCode
+ newPassword:(nullable NSString *)newPassword NS_DESIGNATED_INITIALIZER;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRResetPasswordRequest.m b/Firebase/Auth/Source/RPCs/FIRResetPasswordRequest.m
new file mode 100644
index 0000000..603aa00
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRResetPasswordRequest.m
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRResetPasswordRequest.h"
+
+/** @var kResetPasswordEndpoint
+ @brief The "resetPassword" endpoint.
+ */
+static NSString *const kResetPasswordEndpoint = @"resetPassword";
+
+/** @var kOOBCodeKey
+ @brief The "resetPassword" key.
+ */
+static NSString *const kOOBCodeKey = @"oobCode";
+
+/** @var kCurrentPasswordKey
+ @brief The "newPassword" key.
+ */
+static NSString *const kCurrentPasswordKey = @"newPassword";
+
+@implementation FIRResetPasswordRequest
+
+- (instancetype)initWithAPIKey:(NSString *)APIKey
+ oobCode:(NSString *)oobCode
+ newPassword:(NSString *)newPassword {
+ self = [super initWithEndpoint:kResetPasswordEndpoint APIKey:APIKey];
+ if (self) {
+ _oobCode = oobCode;
+ _updatedPassword = newPassword;
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ NSMutableDictionary *postBody = [NSMutableDictionary dictionary];
+ postBody[kOOBCodeKey] = _oobCode;
+ if (_updatedPassword) {
+ postBody[kCurrentPasswordKey] = _updatedPassword;
+ }
+ return postBody;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRResetPasswordResponse.h b/Firebase/Auth/Source/RPCs/FIRResetPasswordResponse.h
new file mode 100644
index 0000000..28eb5f4
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRResetPasswordResponse.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRAuthResetPasswordResponse
+ @brief Represents the response from the resetPassword endpoint.
+ @remarks Possible error codes:
+ - FIRAuthErrorCodeWeakPassword
+ - FIRAuthErrorCodeUserDisabled
+ - FIRAuthErrorCodeOperationNotAllowed
+ - FIRAuthErrorCodeExpiredActionCode
+ - FIRAuthErrorCodeInvalidActionCode
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/resetPassword
+ */
+@interface FIRResetPasswordResponse : NSObject<FIRAuthRPCResponse>
+
+/** @property email
+ @brief The email address corresponding to the reset password request.
+ */
+@property(nonatomic, strong, readonly) NSString *email;
+
+/** @property verifiedEmail
+ @brief The verified email returned from the backend.
+ */
+@property(nonatomic, strong, readonly) NSString *verifiedEmail;
+
+/** @property requestType
+ @brief The tpye of request as returned by the backend.
+ */
+@property(nonatomic, strong, readonly) NSString *requestType;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRResetPasswordResponse.m b/Firebase/Auth/Source/RPCs/FIRResetPasswordResponse.m
new file mode 100644
index 0000000..d306f6c
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRResetPasswordResponse.m
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRResetPasswordResponse.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+
+@implementation FIRResetPasswordResponse
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _email = [dictionary[@"email"] copy];
+ _requestType = [dictionary[@"requestType"] copy];
+ _verifiedEmail = [dictionary[@"newEmail"] copy];
+ return YES;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRSecureTokenRequest.h b/Firebase/Auth/Source/RPCs/FIRSecureTokenRequest.h
new file mode 100644
index 0000000..44c16b1
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSecureTokenRequest.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @enum FIRSecureTokenRequestGrantType
+ @brief Represents the possible grant types for a token request.
+ */
+typedef NS_ENUM(NSUInteger, FIRSecureTokenRequestGrantType) {
+ /** @var FIRSecureTokenRequestGrantTypeAuthorizationCode
+ @brief Indicates an authorization code request.
+ @remarks Exchanges a Gitkit "ID Token" for an STS Access Token and Refresh Token.
+ */
+ FIRSecureTokenRequestGrantTypeAuthorizationCode,
+
+ /** @var FIRSecureTokenRequestGrantTypeRefreshToken
+ @brief Indicates an refresh token request.
+ @remarks Uses an existing Refresh Token to create a new Access Token.
+ */
+ FIRSecureTokenRequestGrantTypeRefreshToken,
+};
+
+/** @class FIRSecureTokenRequest
+ @brief Represents the parameters for the token endpoint.
+ */
+@interface FIRSecureTokenRequest : NSObject <FIRAuthRPCRequest>
+
+/** @property grantType
+ @brief The type of grant requested.
+ @see FIRSecureTokenRequestGrantType
+ */
+@property(nonatomic, assign, readonly) FIRSecureTokenRequestGrantType grantType;
+
+/** @property scope
+ @brief The scopes requested (a comma-delimited list of scope strings.)
+ */
+@property(nonatomic, copy, readonly, nullable) NSString *scope;
+
+/** @property refreshToken
+ @brief The client's refresh token.
+ */
+@property(nonatomic, copy, readonly, nullable) NSString *refreshToken;
+
+/** @property code
+ @brief The client's authorization code (legacy Gitkit "ID Token").
+ */
+@property(nonatomic, copy, readonly, nullable) NSString *code;
+
+/** @property APIKey
+ @brief The client's API Key.
+ */
+@property(nonatomic, copy, readonly) NSString *APIKey;
+
+/** @fn authCodeRequestWithCode:
+ @brief Creates an authorization code request with the given code (legacy Gitkit "ID Token").
+ @param code The authorization code (legacy Gitkit "ID Token").
+ @param APIKey The client's API Key.
+ @return An authorization request.
+ */
++ (FIRSecureTokenRequest *)authCodeRequestWithCode:(NSString *)code APIKey:(NSString *)APIKey;
+
+/** @fn refreshRequestWithCode:
+ @brief Creates a refresh request with the given refresh token.
+ @param refreshToken The refresh token.
+ @param APIKey The client's API Key.
+ @return A refresh request.
+ */
++ (FIRSecureTokenRequest *)refreshRequestWithRefreshToken:(NSString *)refreshToken
+ APIKey:(NSString *)APIKey;
+
+/** @fn init
+ @brief Please use initWithGrantType:scope:refreshToken:code:
+ */
+- (instancetype)init NS_UNAVAILABLE;
+
+/** @fn initWithGrantType:scope:refreshToken:code:APIKey:
+ @brief Designated initializer.
+ @param grantType The type of request.
+ @param scope The scopes requested.
+ @param refreshToken The client's refresh token (for refresh requests.)
+ @param code The client's authorization code (Gitkit ID Token) (for authorization code requests.)
+ @param APIKey The client's API Key.
+ */
+- (nullable instancetype)initWithGrantType:(FIRSecureTokenRequestGrantType)grantType
+ scope:(nullable NSString *)scope
+ refreshToken:(nullable NSString *)refreshToken
+ code:(nullable NSString *)code
+ APIKey:(NSString *)APIKey NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRSecureTokenRequest.m b/Firebase/Auth/Source/RPCs/FIRSecureTokenRequest.m
new file mode 100644
index 0000000..1983542
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSecureTokenRequest.m
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRSecureTokenRequest.h"
+
+/** @var kFIRSecureTokenServiceGetTokenURLFormat
+ @brief The format of the secure token service URLs. Requires string format substitution with
+ the client's API Key.
+ */
+static NSString *const kFIRSecureTokenServiceGetTokenURLFormat = @"https://%@/v1/token?key=%@";
+
+/** @var kFIRSecureTokenServiceGrantTypeRefreshToken
+ @brief The string value of the @c FIRSecureTokenRequestGrantTypeRefreshToken request type.
+ */
+static NSString *const kFIRSecureTokenServiceGrantTypeRefreshToken = @"refresh_token";
+
+/** @var kFIRSecureTokenServiceGrantTypeAuthorizationCode
+ @brief The string value of the @c FIRSecureTokenRequestGrantTypeAuthorizationCode request type.
+ */
+static NSString *const kFIRSecureTokenServiceGrantTypeAuthorizationCode = @"authorization_code";
+
+/** @var kGrantTypeKey
+ @brief The key for the "grantType" parameter in the request.
+ */
+static NSString *const kGrantTypeKey = @"grantType";
+
+/** @var kScopeKey
+ @brief The key for the "scope" parameter in the request.
+ */
+static NSString *const kScopeKey = @"scope";
+
+/** @var kRefreshTokenKey
+ @brief The key for the "refreshToken" parameter in the request.
+ */
+static NSString *const kRefreshTokenKey = @"refreshToken";
+
+/** @var kCodeKey
+ @brief The key for the "code" parameter in the request.
+ */
+static NSString *const kCodeKey = @"code";
+
+/** @var gAPIHost
+ @brief Host for server API calls.
+ */
+static NSString *gAPIHost = @"securetoken.googleapis.com";
+
+@implementation FIRSecureTokenRequest
+
++ (FIRSecureTokenRequest *)authCodeRequestWithCode:(NSString *)code APIKey:(NSString *)APIKey {
+ return [[self alloc] initWithGrantType:FIRSecureTokenRequestGrantTypeAuthorizationCode
+ scope:nil
+ refreshToken:nil
+ code:code
+ APIKey:APIKey];
+}
+
++ (FIRSecureTokenRequest *)refreshRequestWithRefreshToken:(NSString *)refreshToken
+ APIKey:(NSString *)APIKey {
+ return [[self alloc] initWithGrantType:FIRSecureTokenRequestGrantTypeRefreshToken
+ scope:nil
+ refreshToken:refreshToken
+ code:nil
+ APIKey:APIKey];
+}
+
+/** @fn grantTypeStringWithGrantType:
+ @brief Converts a @c FIRSecureTokenRequestGrantType to it's @c NSString equivilent.
+ */
++ (NSString *)grantTypeStringWithGrantType:(FIRSecureTokenRequestGrantType)grantType {
+ switch (grantType) {
+ case FIRSecureTokenRequestGrantTypeAuthorizationCode:
+ return kFIRSecureTokenServiceGrantTypeAuthorizationCode;
+ case FIRSecureTokenRequestGrantTypeRefreshToken:
+ return kFIRSecureTokenServiceGrantTypeRefreshToken;
+ // No Default case so we will notice if new grant types are added to the enum.
+ }
+}
+
+- (nullable instancetype)initWithGrantType:(FIRSecureTokenRequestGrantType)grantType
+ scope:(nullable NSString *)scope
+ refreshToken:(nullable NSString *)refreshToken
+ code:(nullable NSString *)code
+ APIKey:(NSString *)APIKey {
+ self = [super init];
+ if (self) {
+ _grantType = grantType;
+ _scope = [scope copy];
+ _refreshToken = [refreshToken copy];
+ _code = [code copy];
+ _APIKey = [APIKey copy];
+ }
+ return self;
+}
+
+- (NSURL *)requestURL {
+ NSString *URLString =
+ [NSString stringWithFormat:kFIRSecureTokenServiceGetTokenURLFormat, gAPIHost, _APIKey];
+ NSURL *URL = [NSURL URLWithString:URLString];
+ return URL;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ NSMutableDictionary *postBody = [@{
+ kGrantTypeKey : [[self class] grantTypeStringWithGrantType:_grantType]
+ } mutableCopy];
+ if (_scope) {
+ postBody[kScopeKey] = _scope;
+ }
+ if (_refreshToken) {
+ postBody[kRefreshTokenKey] = _refreshToken;
+ }
+ if (_code) {
+ postBody[kCodeKey] = _code;
+ }
+ return postBody;
+}
+
+#pragma mark - Internal API for development
+
++ (NSString *)host {
+ return gAPIHost;
+}
+
++ (void)setHost:(NSString *)host {
+ gAPIHost = host;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRSecureTokenResponse.h b/Firebase/Auth/Source/RPCs/FIRSecureTokenResponse.h
new file mode 100644
index 0000000..0dd4a20
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSecureTokenResponse.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRSecureTokenResponse
+ @brief Represents the response from the token endpoint.
+ */
+@interface FIRSecureTokenResponse : NSObject <FIRAuthRPCResponse>
+
+/** @property approximateExpirationDate
+ @brief The approximate expiration date of the access token.
+ */
+@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate;
+
+/** @property refreshToken
+ @brief The refresh token. (Possibly an updated one for refresh requests.)
+ */
+@property(nonatomic, copy, readonly, nullable) NSString *refreshToken;
+
+/** @property accessToken
+ @brief The new access token.
+ */
+@property(nonatomic, copy, readonly, nullable) NSString *accessToken;
+
+/** @property IDToken
+ @brief The new ID Token.
+ */
+@property(nonatomic, copy, readonly, nullable) NSString *IDToken;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRSecureTokenResponse.m b/Firebase/Auth/Source/RPCs/FIRSecureTokenResponse.m
new file mode 100644
index 0000000..8ff3dde
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSecureTokenResponse.m
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRSecureTokenResponse.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+
+/** @var kExpiresInKey
+ @brief The key for the number of seconds till the access token expires.
+ */
+static NSString *const kExpiresInKey = @"expires_in";
+
+/** @var kRefreshTokenKey
+ @brief The key for the refresh token.
+ */
+static NSString *const kRefreshTokenKey = @"refresh_token";
+
+/** @var kAccessTokenKey
+ @brief The key for the access token.
+ */
+static NSString *const kAccessTokenKey = @"access_token";
+
+/** @var kIDTokenKey
+ @brief The key for the "id_token" value in the response.
+ */
+static NSString *const kIDTokenKey = @"id_token";
+
+@implementation FIRSecureTokenResponse
+
+- (nullable NSString *)expectedKind {
+ return nil;
+}
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _refreshToken = dictionary[kRefreshTokenKey];
+ _accessToken = dictionary[kAccessTokenKey];
+ _IDToken = dictionary[kIDTokenKey];
+ if (!_accessToken.length) {
+ if (error) {
+ *error = [FIRAuthErrorUtils unexpectedResponseWithDeserializedResponse:dictionary];
+ }
+ return NO;
+ }
+ id expiresIn = dictionary[kExpiresInKey];
+ if (![expiresIn isKindOfClass:[NSString class]]) {
+ if (error) {
+ *error = [FIRAuthErrorUtils unexpectedResponseWithDeserializedResponse:dictionary];
+ }
+ return NO;
+ }
+
+ _approximateExpirationDate = [NSDate dateWithTimeIntervalSinceNow:[expiresIn doubleValue]];
+ return YES;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeRequest.h b/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeRequest.h
new file mode 100644
index 0000000..596fb8c
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeRequest.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRIdentityToolkitRequest.h"
+
+#import "FIRAuthRPCRequest.h"
+#import "FIRIdentityToolkitRequest.h"
+
+@class FIRAuthAppCredential;
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FIRSendVerificationCodeRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property phoneNumber
+ @brief The phone number to which the verification code should be sent.
+ */
+@property(nonatomic, strong, readonly) NSString *phoneNumber;
+
+/** @property appCredential
+ @brief The credential to prove the identity of the app in order to send the verification code.
+ */
+@property(nonatomic, strong, readonly) FIRAuthAppCredential *appCredential;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithPhoneNumber:APIKey:
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+/** @fn initWithPhoneNumber:APIKey:
+ @brief Designated initializer.
+ @param phoneNumber The phone number to which the verification code is to be sent.
+ @param appCredential The credential that proves the identity of the app.
+ @param APIKey The client's API Key.
+ */
+- (nullable instancetype)initWithPhoneNumber:(NSString *)phoneNumber
+ appCredential:(FIRAuthAppCredential *)appCredential
+ APIKey:(NSString *)APIKey NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeRequest.m b/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeRequest.m
new file mode 100644
index 0000000..f2212ad
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeRequest.m
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRSendVerificationCodeRequest.h"
+
+#import "../Private/FIRAuthAppCredential.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @var kSendVerificationCodeEndPoint
+ @brief The "sendVerificationCodeEnd" endpoint.
+ */
+static NSString *const kSendVerificationCodeEndPoint = @"sendVerificationCode";
+
+/** @var kPhoneNumberKey
+ @brief The key for the Phone Number parameter in the request.
+ */
+static NSString *const kPhoneNumberKey = @"phoneNumber";
+
+/** @var kReceiptKey
+ @brief The key for the receipt parameter in the request.
+ */
+static NSString *const kReceiptKey = @"iosReceipt";
+
+/** @var kSecretKey
+ @brief The key for the Secret parameter in the request.
+ */
+static NSString *const kSecretKey = @"iosSecret";
+
+@implementation FIRSendVerificationCodeRequest {
+}
+
+- (nullable instancetype)initWithPhoneNumber:(NSString *)phoneNumber
+ appCredential:(FIRAuthAppCredential *)appCredential
+ APIKey:(NSString *)APIKey {
+ self = [super initWithEndpoint:kSendVerificationCodeEndPoint APIKey:APIKey];
+ if (self) {
+ _phoneNumber = [phoneNumber copy];
+ _appCredential = appCredential;
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ NSMutableDictionary *postBody = [NSMutableDictionary dictionary];
+ if (_phoneNumber) {
+ postBody[kPhoneNumberKey] = _phoneNumber;
+ }
+ if (_appCredential.receipt) {
+ postBody[kReceiptKey] = _appCredential.receipt;
+ }
+ if (_appCredential.secret) {
+ postBody[kSecretKey] = _appCredential.secret;
+ }
+ return postBody;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeResponse.h b/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeResponse.h
new file mode 100644
index 0000000..1a49ec2
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeResponse.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FIRSendVerificationCodeResponse : NSObject <FIRAuthRPCResponse>
+
+/** @property verificationID
+ @brief Encrypted session information returned by the backend.
+ */
+@property(nonatomic, readonly) NSString *verificationID;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeResponse.m b/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeResponse.m
new file mode 100644
index 0000000..9e47b6e
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSendVerificationCodeResponse.m
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRSendVerificationCodeResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation FIRSendVerificationCodeResponse
+
+// TODO: remove when resolving b/37169084 .
+- (nullable NSString *)expectedKind {
+ return nil;
+}
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _verificationID = [dictionary[@"sessionInfo"] copy];
+ return YES;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRSetAccountInfoRequest.h b/Firebase/Auth/Source/RPCs/FIRSetAccountInfoRequest.h
new file mode 100644
index 0000000..4816474
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSetAccountInfoRequest.h
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCRequest.h"
+#import "FIRIdentityToolkitRequest.h"
+
+@class FIRGetAccountInfoResponse;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @var FIRSetAccountInfoUserAttributeEmail
+ @brief Constant for email attribute used in "deleteAttributes".
+ */
+extern NSString *const FIRSetAccountInfoUserAttributeEmail;
+
+/** @var FIRSetAccountInfoUserAttributeDisplayName
+ @brief Constant for displayName attribute used in "deleteAttributes".
+ */
+extern NSString *const FIRSetAccountInfoUserAttributeDisplayName;
+
+/** @var FIRSetAccountInfoUserAttributeProvider
+ @brief Constant for provider attribute used in "deleteAttributes".
+ */
+extern NSString *const FIRSetAccountInfoUserAttributeProvider;
+
+/** @var FIRSetAccountInfoUserAttributePhotoURL
+ @brief Constant for photoURL attribute used in "deleteAttributes".
+ */
+extern NSString *const FIRSetAccountInfoUserAttributePhotoURL;
+
+/** @var FIRSetAccountInfoUserAttributePassword
+ @brief Constant for password attribute used in "deleteAttributes".
+ */
+extern NSString *const FIRSetAccountInfoUserAttributePassword;
+
+/** @class FIRSetAccountInfoRequest
+ @brief Represents the parameters for the setAccountInfo endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/setAccountInfo
+ */
+@interface FIRSetAccountInfoRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property accessToken
+ @brief The STS Access Token of the authenticated user.
+ */
+@property(nonatomic, copy, nullable) NSString *accessToken;
+
+/** @property displayName
+ @brief The name of the user.
+ */
+@property(nonatomic, copy, nullable) NSString *displayName;
+
+/** @property localID
+ @brief The local ID of the user.
+ */
+@property(nonatomic, copy, nullable) NSString *localID;
+
+/** @property email
+ @brief The email of the user.
+ */
+@property(nonatomic, copy, nullable) NSString *email;
+
+/** @property photoURL
+ @brief The photoURL of the user.
+ */
+@property(nonatomic, copy, nullable) NSURL *photoURL;
+
+/** @property password
+ @brief The new password of the user.
+ */
+@property(nonatomic, copy, nullable) NSString *password;
+
+/** @property providers
+ @brief The associated identity providers of the user.
+ */
+@property(nonatomic, copy, nullable) NSArray<NSString *> *providers;
+
+/** @property OOBCode
+ @brief The out-of-band code of the change email request.
+ */
+@property(nonatomic, copy, nullable) NSString *OOBCode;
+
+/** @property emailVerified
+ @brief Whether to mark the email as verified or not.
+ */
+@property(nonatomic, assign) BOOL emailVerified;
+
+/** @property upgradeToFederatedLogin
+ @brief Whether to mark the user to upgrade to federated login.
+ */
+@property(nonatomic, assign) BOOL upgradeToFederatedLogin;
+
+/** @property captchaChallenge
+ @brief The captcha challenge.
+ */
+@property(nonatomic, copy, nullable) NSString *captchaChallenge;
+
+/** @property captchaResponse
+ @brief Response to the captcha.
+ */
+@property(nonatomic, copy, nullable) NSString *captchaResponse;
+
+/** @property deleteAttributes
+ @brief The list of user attributes to delete.
+ @remarks Every element of the list must be one of the predefined constant starts with
+ "FIRSetAccountInfoUserAttribute".
+ */
+@property(nonatomic, copy, nullable) NSArray<NSString *> *deleteAttributes;
+
+/** @property deleteProviders
+ @brief The list of identity providers to delete.
+ */
+@property(nonatomic, copy, nullable) NSArray<NSString *> *deleteProviders;
+
+/** @property returnSecureToken
+ @brief Whether the response should return access token and refresh token directly.
+ @remarks The default value is @c YES .
+ */
+@property(nonatomic, assign) BOOL returnSecureToken;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithAPIKey:
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+/** @fn initWithAPIKey:
+ @brief Designated initializer.
+ @param APIKey The client's API Key.
+ */
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRSetAccountInfoRequest.m b/Firebase/Auth/Source/RPCs/FIRSetAccountInfoRequest.m
new file mode 100644
index 0000000..b18d0dd
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSetAccountInfoRequest.m
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRSetAccountInfoRequest.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+#import "../Private/FIRAuth_Internal.h"
+#import "FIRGetAccountInfoResponse.h"
+
+NSString *const FIRSetAccountInfoUserAttributeEmail = @"EMAIL";
+
+NSString *const FIRSetAccountInfoUserAttributeDisplayName = @"DISPLAY_NAME";
+
+NSString *const FIRSetAccountInfoUserAttributeProvider = @"PROVIDER";
+
+NSString *const FIRSetAccountInfoUserAttributePhotoURL = @"PHOTO_URL";
+
+NSString *const FIRSetAccountInfoUserAttributePassword = @"PASSWORD";
+
+/** @var kCreateAuthURIEndpoint
+ @brief The "setAccountInfo" endpoint.
+ */
+static NSString *const kSetAccountInfoEndpoint = @"setAccountInfo";
+
+/** @var kIDTokenKey
+ @brief The key for the "idToken" value in the request. This is actually the STS Access Token,
+ despite it's confusing (backwards compatiable) parameter name.
+ */
+static NSString *const kIDTokenKey = @"idToken";
+
+/** @var kDisplayNameKey
+ @brief The key for the "displayName" value in the request.
+ */
+static NSString *const kDisplayNameKey = @"displayName";
+
+/** @var kLocalIDKey
+ @brief The key for the "localID" value in the request.
+ */
+static NSString *const kLocalIDKey = @"localId";
+
+/** @var kEmailKey
+ @brief The key for the "email" value in the request.
+ */
+static NSString *const kEmailKey = @"email";
+
+/** @var kPasswordKey
+ @brief The key for the "password" value in the request.
+ */
+static NSString *const kPasswordKey = @"password";
+
+/** @var kPhotoURLKey
+ @brief The key for the "photoURL" value in the request.
+ */
+static NSString *const kPhotoURLKey = @"photoUrl";
+
+/** @var kProvidersKey
+ @brief The key for the "providers" value in the request.
+ */
+static NSString *const kProvidersKey = @"provider";
+
+/** @var kOOBCodeKey
+ @brief The key for the "OOBCode" value in the request.
+ */
+static NSString *const kOOBCodeKey = @"oobCode";
+
+/** @var kEmailVerifiedKey
+ @brief The key for the "emailVerified" value in the request.
+ */
+static NSString *const kEmailVerifiedKey = @"emailVerified";
+
+/** @var kUpgradeToFederatedLoginKey
+ @brief The key for the "upgradeToFederatedLogin" value in the request.
+ */
+static NSString *const kUpgradeToFederatedLoginKey = @"upgradeToFederatedLogin";
+
+/** @var kCaptchaChallengeKey
+ @brief The key for the "captchaChallenge" value in the request.
+ */
+static NSString *const kCaptchaChallengeKey = @"captchaChallenge";
+
+/** @var kCaptchaResponseKey
+ @brief The key for the "captchaResponse" value in the request.
+ */
+static NSString *const kCaptchaResponseKey = @"captchaResponse";
+
+/** @var kDeleteAttributesKey
+ @brief The key for the "deleteAttribute" value in the request.
+ */
+static NSString *const kDeleteAttributesKey = @"deleteAttribute";
+
+/** @var kDeleteProvidersKey
+ @brief The key for the "deleteProvider" value in the request.
+ */
+static NSString *const kDeleteProvidersKey = @"deleteProvider";
+
+/** @var kReturnSecureTokenKey
+ @brief The key for the "returnSecureToken" value in the request.
+ */
+static NSString *const kReturnSecureTokenKey = @"returnSecureToken";
+
+@implementation FIRSetAccountInfoRequest
+
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey {
+ self = [super initWithEndpoint:kSetAccountInfoEndpoint APIKey:APIKey];
+ if (self) {
+ _returnSecureToken = YES;
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ NSMutableDictionary *postBody = [NSMutableDictionary dictionary];
+ if (_accessToken) {
+ postBody[kIDTokenKey] = _accessToken;
+ }
+ if (_displayName) {
+ postBody[kDisplayNameKey] = _displayName;
+ }
+ if (_localID) {
+ postBody[kLocalIDKey] = _localID;
+ }
+ if (_email) {
+ postBody[kEmailKey] = _email;
+ }
+ if (_password) {
+ postBody[kPasswordKey] = _password;
+ }
+ if (_photoURL) {
+ postBody[kPhotoURLKey] = _photoURL.absoluteString;
+ }
+ if (_providers) {
+ postBody[kProvidersKey] = _providers;
+ }
+ if (_OOBCode) {
+ postBody[kOOBCodeKey] = _OOBCode;
+ }
+ if (_emailVerified) {
+ postBody[kEmailVerifiedKey] = @YES;
+ }
+ if (_upgradeToFederatedLogin) {
+ postBody[kUpgradeToFederatedLoginKey] = @YES;
+ }
+ if (_captchaChallenge) {
+ postBody[kCaptchaChallengeKey] = _captchaChallenge;
+ }
+ if (_captchaResponse) {
+ postBody[kCaptchaResponseKey] = _captchaResponse;
+ }
+ if (_deleteAttributes) {
+ postBody[kDeleteAttributesKey] = _deleteAttributes;
+ }
+ if (_deleteProviders) {
+ postBody[kDeleteProvidersKey] = _deleteProviders;
+ }
+ if (_returnSecureToken) {
+ postBody[kReturnSecureTokenKey] = @YES;
+ }
+ return postBody;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRSetAccountInfoResponse.h b/Firebase/Auth/Source/RPCs/FIRSetAccountInfoResponse.h
new file mode 100644
index 0000000..92895c0
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSetAccountInfoResponse.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRSetAccountInfoResponseProviderUserInfo
+ @brief Represents the provider user info part of the response from the setAccountInfo endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/setAccountInfo
+ */
+@interface FIRSetAccountInfoResponseProviderUserInfo : NSObject
+
+/** @property providerID
+ @brief The ID of the identity provider.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *providerID;
+
+/** @property displayName
+ @brief The user's display name at the identity provider.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *displayName;
+
+/** @property photoURL
+ @brief The user's photo URL at the identity provider.
+ */
+@property(nonatomic, strong, readonly, nullable) NSURL *photoURL;
+
+/** @fn init
+ @brief Please use initWithDictionary:
+ */
+- (instancetype)init NS_UNAVAILABLE;
+
+/** @fn initWithAPIKey:
+ @brief Designated initializer.
+ @param dictionary The provider user info data from endpoint.
+ */
+- (instancetype)initWithDictionary:(NSDictionary *)dictionary NS_DESIGNATED_INITIALIZER;
+
+@end
+
+/** @class FIRSetAccountInfoResponse
+ @brief Represents the response from the setAccountInfo endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/setAccountInfo
+ */
+@interface FIRSetAccountInfoResponse : NSObject <FIRAuthRPCResponse>
+
+/** @property email
+ @brief The email or the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *email;
+
+/** @property displayName
+ @brief The display name of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *displayName;
+
+/** @property providerUserInfo
+ @brief The user's profiles at the associated identity providers.
+ */
+@property(nonatomic, strong, readonly, nullable)
+ NSArray<FIRSetAccountInfoResponseProviderUserInfo *> *providerUserInfo;
+
+/** @property IDToken
+ @brief Either an authorization code suitable for performing an STS token exchange, or the
+ access token from Secure Token Service, depending on whether @c returnSecureToken is set
+ on the request.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *IDToken;
+
+/** @property approximateExpirationDate
+ @brief The approximate expiration date of the access token.
+ */
+@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate;
+
+/** @property refreshToken
+ @brief The refresh token from Secure Token Service.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *refreshToken;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRSetAccountInfoResponse.m b/Firebase/Auth/Source/RPCs/FIRSetAccountInfoResponse.m
new file mode 100644
index 0000000..140ba25
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSetAccountInfoResponse.m
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRSetAccountInfoResponse.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+
+@implementation FIRSetAccountInfoResponseProviderUserInfo
+
+- (instancetype)initWithDictionary:(NSDictionary *)dictionary {
+ self = [super init];
+ if (self) {
+ _providerID = [dictionary[@"providerId"] copy];
+ _displayName = [dictionary[@"displayName"] copy];
+ NSString *photoURL = dictionary[@"photoUrl"];
+ if (photoURL) {
+ _photoURL = [NSURL URLWithString:photoURL];
+ }
+ }
+ return self;
+}
+
+@end
+
+@implementation FIRSetAccountInfoResponse
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _email = [dictionary[@"email"] copy];
+ _displayName = [dictionary[@"displayName"] copy];
+ _IDToken = [dictionary[@"idToken"] copy];
+ _approximateExpirationDate = [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] ?
+ [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] : nil;
+ _refreshToken = [dictionary[@"refreshToken"] copy];
+ NSArray<NSDictionary *> *providerUserInfoData = dictionary[@"providerUserInfo"];
+ if (providerUserInfoData) {
+ NSMutableArray<FIRSetAccountInfoResponseProviderUserInfo *> *providerUserInfoArray =
+ [NSMutableArray arrayWithCapacity:providerUserInfoData.count];
+ for (NSDictionary *dictionary in providerUserInfoData) {
+ [providerUserInfoArray addObject:
+ [[FIRSetAccountInfoResponseProviderUserInfo alloc] initWithDictionary:dictionary]];
+ }
+ _providerUserInfo = [providerUserInfoArray copy];
+ }
+ return YES;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRSignUpNewUserRequest.h b/Firebase/Auth/Source/RPCs/FIRSignUpNewUserRequest.h
new file mode 100644
index 0000000..46b47d5
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSignUpNewUserRequest.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCRequest.h"
+#import "FIRIdentityToolkitRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FIRSignUpNewUserRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property email
+ @brief The email of the user.
+ */
+@property(nonatomic, copy, nullable) NSString *email;
+
+/** @property password
+ @brief The password inputed by the user.
+ */
+@property(nonatomic, copy, nullable) NSString *password;
+
+/** @property displayName
+ @brief The password inputed by the user.
+ */
+@property(nonatomic, copy, nullable) NSString *displayName;
+
+/** @property returnSecureToken
+ @brief Whether the response should return access token and refresh token directly.
+ @remarks The default value is @c YES .
+ */
+@property(nonatomic, assign) BOOL returnSecureToken;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithEmail:password:APIKey:
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+/** @fn initWithAPIKey:
+ @brief initializer for anonymous sign-in.
+ */
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey;
+
+/** @fn initWithAPIKey:email:password:
+ @brief Designated initializer.
+ */
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey
+ email:(nullable NSString *)email
+ password:(nullable NSString *)password
+ displayName:(nullable NSString *)displayName NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRSignUpNewUserRequest.m b/Firebase/Auth/Source/RPCs/FIRSignUpNewUserRequest.m
new file mode 100644
index 0000000..af60b11
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSignUpNewUserRequest.m
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRSignUpNewUserRequest.h"
+
+/** @var kSignupNewUserEndpoint
+ @brief The "SingupNewUserEndpoint" endpoint.
+ */
+static NSString *const kSignupNewUserEndpoint = @"signupNewUser";
+
+/** @var kEmailKey
+ @brief The key for the "email" value in the request.
+ */
+static NSString *const kEmailKey = @"email";
+
+/** @var kPasswordKey
+ @brief The key for the "password" value in the request.
+ */
+static NSString *const kPasswordKey = @"password";
+
+/** @var kDisplayNameKey
+ @brief The key for the "kDisplayName" value in the request.
+ */
+static NSString *const kDisplayNameKey = @"displayName";
+
+/** @var kReturnSecureTokenKey
+ @brief The key for the "returnSecureToken" value in the request.
+ */
+static NSString *const kReturnSecureTokenKey = @"returnSecureToken";
+
+@implementation FIRSignUpNewUserRequest
+
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey
+ email:(NSString *)email
+ password:(NSString *)password
+ displayName:(NSString *)displayName {
+ self = [super initWithEndpoint:kSignupNewUserEndpoint APIKey:APIKey];
+ if (self) {
+ _email = [email copy];
+ _password = [password copy];
+ _displayName = [displayName copy];
+ _returnSecureToken = YES;
+ }
+ return self;
+}
+
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey{
+ self = [self initWithAPIKey:APIKey email:nil password:nil displayName:nil];
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ NSMutableDictionary *postBody = [NSMutableDictionary dictionary];
+ if (_email) {
+ postBody[kEmailKey] = _email;
+ }
+ if (_password) {
+ postBody[kPasswordKey] = _password;
+ }
+ if (_displayName) {
+ postBody[kDisplayNameKey] = _displayName;
+ }
+ if (_returnSecureToken) {
+ postBody[kReturnSecureTokenKey] = @YES;
+ }
+ return postBody;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRSignUpNewUserResponse.h b/Firebase/Auth/Source/RPCs/FIRSignUpNewUserResponse.h
new file mode 100644
index 0000000..0d55939
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSignUpNewUserResponse.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FIRSignUpNewUserResponse : NSObject<FIRAuthRPCResponse>
+
+/** @property IDToken
+ @brief Either an authorization code suitable for performing an STS token exchange, or the
+ access token from Secure Token Service, depending on whether @c returnSecureToken is set
+ on the request.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *IDToken;
+
+/** @property approximateExpirationDate
+ @brief The approximate expiration date of the access token.
+ */
+@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate;
+
+/** @property refreshToken
+ @brief The refresh token from Secure Token Service.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *refreshToken;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRSignUpNewUserResponse.m b/Firebase/Auth/Source/RPCs/FIRSignUpNewUserResponse.m
new file mode 100644
index 0000000..4196d21
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRSignUpNewUserResponse.m
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRSignUpNewUserResponse.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+
+@implementation FIRSignUpNewUserResponse
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _IDToken = [dictionary[@"idToken"] copy];
+ _approximateExpirationDate = [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] ?
+ [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] : nil;
+ _refreshToken = [dictionary[@"refreshToken"] copy];
+ return YES;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyAssertionRequest.h b/Firebase/Auth/Source/RPCs/FIRVerifyAssertionRequest.h
new file mode 100644
index 0000000..3202b47
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyAssertionRequest.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCRequest.h"
+#import "FIRIdentityToolkitRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRVerifyAssertionRequest
+ @brief Represents the parameters for the verifyAssertion endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/verifyAssertion
+ */
+@interface FIRVerifyAssertionRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property requestURI
+ @brief The URI to which the IDP redirects the user back. It may contain federated login result
+ params added by the IDP.
+ */
+@property(nonatomic, copy, nullable) NSString *requestURI;
+
+/** @property pendingIDToken
+ @brief The Firebase ID Token for the non-trusted IDP pending to be confirmed by the user.
+ */
+@property(nonatomic, copy, nullable) NSString *pendingIDToken;
+
+/** @property accessToken
+ @brief The STS Access Token for the authenticated user, only needed for linking the user.
+ */
+@property(nonatomic, copy, nullable) NSString *accessToken;
+
+/** @property returnSecureToken
+ @brief Whether the response should return access token and refresh token directly.
+ @remarks The default value is @c YES .
+ */
+@property(nonatomic, assign) BOOL returnSecureToken;
+
+#pragma mark - Components of "postBody"
+
+/** @property providerID
+ @brief The ID of the IDP whose credentials are being presented to the endpoint.
+ */
+@property(nonatomic, copy, readonly) NSString *providerID;
+
+/** @property providerAccessToken
+ @brief An access token from the IDP.
+ */
+@property(nonatomic, copy, nullable) NSString *providerAccessToken;
+
+/** @property providerIDToken
+ @brief An ID Token from the IDP.
+ */
+@property(nonatomic, copy, nullable) NSString *providerIDToken;
+
+/** @property providerOAuthTokenSecret
+ @brief An OAuth client secret from the IDP.
+ */
+@property(nonatomic, copy, nullable) NSString *providerOAuthTokenSecret;
+
+/** @property inputEmail
+ @brief The originally entered email in the UI.
+ */
+@property(nonatomic, copy, nullable) NSString *inputEmail;
+
+/** @property autoCreate
+ @brief A flag that indicates whether or not the user should be automatically created.
+ */
+@property(nonatomic, assign) BOOL autoCreate;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithAPIKey:
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+/** @fn initWithAPIKey:
+ @brief Designated initializer.
+ @param APIKey The client's API Key.
+ @param providerID The auth provider's ID.
+ */
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey
+ providerID:(NSString *)providerID NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyAssertionRequest.m b/Firebase/Auth/Source/RPCs/FIRVerifyAssertionRequest.m
new file mode 100644
index 0000000..b31ae42
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyAssertionRequest.m
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRVerifyAssertionRequest.h"
+
+#import <GoogleToolboxForMac/GTMNSData+zlib.h>
+#import <GoogleToolboxForMac/GTMNSDictionary+URLArguments.h>
+
+/** @var kVerifyAssertionEndpoint
+ @brief The "verifyAssertion" endpoint.
+ */
+static NSString *const kVerifyAssertionEndpoint = @"verifyAssertion";
+
+/** @var kProviderIDKey
+ @brief The key for the "providerId" value in the request.
+ */
+static NSString *const kProviderIDKey = @"providerId";
+
+/** @var kProviderIDTokenKey
+ @brief The key for the "id_token" value in the request.
+ */
+static NSString *const kProviderIDTokenKey = @"id_token";
+
+/** @var kProviderAccessTokenKey
+ @brief The key for the "access_token" value in the request.
+ */
+static NSString *const kProviderAccessTokenKey = @"access_token";
+
+/** @var kProviderOAuthTokenSecretKey
+ @brief The key for the "oauth_token_secret" value in the request.
+ */
+static NSString *const kProviderOAuthTokenSecretKey = @"oauth_token_secret";
+
+/** @var kIdentifierKey
+ @brief The key for the "identifier" value in the request.
+ */
+static NSString *const kIdentifierKey = @"identifier";
+
+/** @var kRequestURIKey
+ @brief The key for the "requestUri" value in the request.
+ */
+static NSString *const kRequestURIKey = @"requestUri";
+
+/** @var kPostBodyKey
+ @brief The key for the "postBody" value in the request.
+ */
+static NSString *const kPostBodyKey = @"postBody";
+
+/** @var kPendingIDTokenKey
+ @brief The key for the "pendingIdToken" value in the request.
+ */
+static NSString *const kPendingIDTokenKey = @"pendingIdToken";
+
+/** @var kAutoCreateKey
+ @brief The key for the "autoCreate" value in the request.
+ */
+static NSString *const kAutoCreateKey = @"autoCreate";
+
+/** @var kIDTokenKey
+ @brief The key for the "idToken" value in the request. This is actually the STS Access Token,
+ despite it's confusing (backwards compatiable) parameter name.
+ */
+static NSString *const kIDTokenKey = @"idToken";
+
+/** @var kReturnSecureTokenKey
+ @brief The key for the "returnSecureToken" value in the request.
+ */
+static NSString *const kReturnSecureTokenKey = @"returnSecureToken";
+
+@implementation FIRVerifyAssertionRequest
+
+- (nullable instancetype)initWithAPIKey:(NSString *)APIKey
+ providerID:(nonnull NSString *)providerID{
+ self = [super initWithEndpoint:kVerifyAssertionEndpoint APIKey:APIKey];
+ if (self) {
+ _providerID = providerID;
+ _returnSecureToken = YES;
+ _autoCreate = YES;
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ NSMutableDictionary *postBody = [@{
+ kProviderIDKey : _providerID,
+ } mutableCopy];
+
+ if (_providerIDToken) {
+ postBody[kProviderIDTokenKey] = _providerIDToken;
+ }
+
+ if (_providerAccessToken) {
+ postBody[kProviderAccessTokenKey] = _providerAccessToken;
+ }
+
+ if (!_providerIDToken && !_providerAccessToken) {
+ [NSException raise:NSInvalidArgumentException
+ format:@"Either IDToken or accessToken must be supplied."];
+ }
+
+ if (_providerOAuthTokenSecret) {
+ postBody[kProviderOAuthTokenSecretKey] = _providerOAuthTokenSecret;
+ }
+
+ if (_inputEmail) {
+ postBody[kIdentifierKey] = _inputEmail;
+ }
+
+ NSMutableDictionary *body = [@{
+ kRequestURIKey : @"http://localhost", // Unused by server, but required
+ kPostBodyKey : [postBody gtm_httpArgumentsString]
+ } mutableCopy];
+
+ if (_pendingIDToken) {
+ body[kPendingIDTokenKey] = _pendingIDToken;
+ }
+ if (_accessToken) {
+ body[kIDTokenKey] = _accessToken;
+ }
+ if (_returnSecureToken) {
+ body[kReturnSecureTokenKey] = @YES;
+ }
+
+ body[kAutoCreateKey] = @(_autoCreate);
+
+ return body;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyAssertionResponse.h b/Firebase/Auth/Source/RPCs/FIRVerifyAssertionResponse.h
new file mode 100644
index 0000000..ce796ee
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyAssertionResponse.h
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRVerifyAssertionResponse
+ @brief Represents the response from the verifyAssertion endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/verifyAssertion
+ */
+@interface FIRVerifyAssertionResponse : NSObject <FIRAuthRPCResponse>
+
+/** @property federatedID
+ @brief The unique ID identifies the IdP account.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *federatedID;
+
+/** @property providerID
+ @brief The IdP ID. For white listed IdPs it's a short domain name e.g. google.com, aol.com,
+ live.net and yahoo.com. If the "providerId" param is set to OpenID OP identifer other than
+ the whilte listed IdPs the OP identifier is returned. If the "identifier" param is federated
+ ID in the createAuthUri request. The domain part of the federated ID is returned.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *providerID;
+
+/** @property localID
+ @brief The RP local ID if it's already been mapped to the IdP account identified by the
+ federated ID.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *localID;
+
+/** @property email
+ @brief The email returned by the IdP. NOTE: The federated login user may not own the email.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *email;
+
+/** @property inputEmail
+ @brief It's the identifier param in the createAuthUri request if the identifier is an email. It
+ can be used to check whether the user input email is different from the asserted email.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *inputEmail;
+
+/** @property originalEmail
+ @brief The original email stored in the mapping storage. It's returned when the federated ID is
+ associated to a different email.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *originalEmail;
+
+/** @property oauthRequestToken
+ @brief The user approved request token for the OpenID OAuth extension.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *oauthRequestToken;
+
+/** @property oauthScope
+ @brief The scope for the OpenID OAuth extension.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *oauthScope;
+
+/** @property firstName
+ @brief The first name of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *firstName;
+
+/** @property lastName
+ @brief The last name of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *lastName;
+
+/** @property fullName
+ @brief The full name of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *fullName;
+
+/** @property nickName
+ @brief The nick name of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *nickName;
+
+/** @property displayName
+ @brief The display name of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *displayName;
+
+/** @property IDToken
+ @brief Either an authorization code suitable for performing an STS token exchange, or the
+ access token from Secure Token Service, depending on whether @c returnSecureToken is set
+ on the request.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *IDToken;
+
+/** @property approximateExpirationDate
+ @brief The approximate expiration date of the access token.
+ */
+@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate;
+
+/** @property refreshToken
+ @brief The refresh token from Secure Token Service.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *refreshToken;
+
+/** @property action
+ @brief The action code.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *action;
+
+/** @property language
+ @brief The language preference of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *language;
+
+/** @property timeZone
+ @brief The timezone of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *timeZone;
+
+/** @property photoURL
+ @brief The URI of the public accessible profile picture.
+ */
+@property(nonatomic, strong, readonly, nullable) NSURL *photoURL;
+
+/** @property dateOfBirth
+ @brief The birth date of the IdP account.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *dateOfBirth;
+
+/** @property context
+ @brief The opaque value used by the client to maintain context info between the authentication
+ request and the IDP callback.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *context;
+
+/** @property verifiedProvider
+ @brief When action is 'map', contains the idps which can be used for confirmation.
+ */
+@property(nonatomic, strong, readonly, nullable) NSArray<NSString *> *verifiedProvider;
+
+/** @property needConfirmation
+ @brief Whether the assertion is from a non-trusted IDP and need account linking confirmation.
+ */
+@property(nonatomic, assign) BOOL needConfirmation;
+
+/** @property emailRecycled
+ @brief It's true if the email is recycled.
+ */
+@property(nonatomic, assign) BOOL emailRecycled;
+
+/** @property emailVerified
+ @brief The value is true if the IDP is also the email provider. It means the user owns the
+ email.
+ */
+@property(nonatomic, assign) BOOL emailVerified;
+
+/** @property isNewUser
+ @brief Flag indicating that the user signing in is a new user and not a returning user.
+ */
+@property(nonatomic, assign) BOOL isNewUser;
+
+/** @property profile
+ @brief Dictionary containing the additional IdP specific information.
+ */
+@property(nonatomic, readonly, nullable) NSDictionary<NSString *, NSObject *> *profile;
+
+/** @property username
+ @brief The name of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *username;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyAssertionResponse.m b/Firebase/Auth/Source/RPCs/FIRVerifyAssertionResponse.m
new file mode 100644
index 0000000..6ae33c6
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyAssertionResponse.m
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRVerifyAssertionResponse.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+
+@implementation FIRVerifyAssertionResponse
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _federatedID = [dictionary[@"federatedId"] copy];
+ _providerID = [dictionary[@"providerId"] copy];
+ _localID = [dictionary[@"localId"] copy];
+ _emailRecycled = [dictionary[@"emailRecycled"] boolValue];
+ _emailVerified = [dictionary[@"emailVerified"] boolValue];
+ _email = [dictionary[@"email"] copy];
+ _inputEmail = [dictionary[@"inputEmail"] copy];
+ _originalEmail = [dictionary[@"originalEmail"] copy];
+ _oauthRequestToken = [dictionary[@"oauthRequestToken"] copy];
+ _oauthScope = [dictionary[@"oauthScope"] copy];
+ _firstName = [dictionary[@"firstName"] copy];
+ _lastName = [dictionary[@"lastName"] copy];
+ _fullName = [dictionary[@"fullName"] copy];
+ _nickName = [dictionary[@"nickName"] copy];
+ _displayName = [dictionary[@"displayName"] copy];
+ _IDToken = [dictionary[@"idToken"] copy];
+ _approximateExpirationDate = [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] ?
+ [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] : nil;
+ _refreshToken = [dictionary[@"refreshToken"] copy];
+ _isNewUser = [dictionary[@"isNewUser"] boolValue];
+ id rawUserInfo = dictionary[@"rawUserInfo"];
+ if ([rawUserInfo isKindOfClass:[NSString class]]) {
+ NSData *data = [rawUserInfo dataUsingEncoding:NSUTF8StringEncoding];
+ rawUserInfo = [NSJSONSerialization JSONObjectWithData:data
+ options:NSJSONReadingMutableLeaves
+ error:nil];
+ }
+ if ([rawUserInfo isKindOfClass:[NSDictionary class]]) {
+ _profile = [[NSDictionary alloc] initWithDictionary:rawUserInfo
+ copyItems:YES];
+ }
+ _username = [dictionary[@"username"] copy];
+ _action = [dictionary[@"action"] copy];
+ _language = [dictionary[@"language"] copy];
+ _timeZone = [dictionary[@"timeZone"] copy];
+ _photoURL = dictionary[@"photoUrl"] ? [NSURL URLWithString:dictionary[@"photoUrl"]] : nil;
+ _dateOfBirth = [dictionary[@"dateOfBirth"] copy];
+ _context = [dictionary[@"context"] copy];
+ _needConfirmation = [dictionary[@"needConfirmation"] boolValue];
+ id verifiedProvider = dictionary[@"verifiedProvider"];
+ if ([verifiedProvider isKindOfClass:[NSString class]]) {
+ NSData *data = [verifiedProvider dataUsingEncoding:NSUTF8StringEncoding];
+ verifiedProvider = [NSJSONSerialization JSONObjectWithData:data
+ options:NSJSONReadingMutableLeaves
+ error:nil];
+ }
+ if ([verifiedProvider isKindOfClass:[NSArray class]]) {
+ _verifiedProvider = [[NSArray alloc] initWithArray:verifiedProvider
+ copyItems:YES];
+ }
+ return YES;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyClientRequest.h b/Firebase/Auth/Source/RPCs/FIRVerifyClientRequest.h
new file mode 100644
index 0000000..b5da6b8
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyClientRequest.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRIdentityToolkitRequest.h"
+
+#import "FIRAuthRPCRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FIRVerifyClientRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property appToken
+ @brief The APNS device token.
+ */
+@property(nonatomic, readonly, nullable) NSString *appToken;
+
+/** @property isSandbox
+ @brief The flag that denotes if the appToken pertains to Sandbox or Production.
+ */
+@property(nonatomic, assign, readonly) BOOL isSandbox;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithAppToken:isSandbox: instead.
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+/** @fn initWithAppToken:isSandbox:
+ @brief Designated initializer.
+ @param appToken The APNS device token.
+ @param isSandbox The flag indicating whether or not the app token provided is for Sandbox or
+ Production.
+ */
+- (nullable instancetype)initWithAppToken:(NSString *)appToken
+ isSandbox:(BOOL)isSandbox
+ APIKey:(NSString *)APIKey NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyClientRequest.m b/Firebase/Auth/Source/RPCs/FIRVerifyClientRequest.m
new file mode 100644
index 0000000..7b4b469
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyClientRequest.m
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRVerifyClientRequest.h"
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @var kVerifyClientEndpoint
+ @brief The endpoint for the verifyClient request.
+ */
+static NSString *const kVerifyClientEndpoint = @"verifyClient";
+
+/** @var kAppTokenKey
+ @brief The key for the appToken request paramenter.
+ */
+static NSString *const kAPPTokenKey = @"appToken";
+
+/** @var kIsSandboxKey
+ @brief The key for the isSandbox request parameter
+ */
+static NSString *const kIsSandboxKey = @"isSandbox";
+
+@implementation FIRVerifyClientRequest
+
+- (nullable instancetype)initWithAppToken:(NSString *)appToken
+ isSandbox:(BOOL)isSandbox
+ APIKey:(NSString *)APIKey {
+ self = [super initWithEndpoint:kVerifyClientEndpoint APIKey:APIKey];
+ if (self) {
+ _appToken = appToken;
+ _isSandbox = isSandbox;
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *__autoreleasing _Nullable *)error {
+ NSMutableDictionary *postBody = [NSMutableDictionary dictionary];
+ if (_appToken) {
+ postBody[kAPPTokenKey] = _appToken;
+ }
+ if (_isSandbox) {
+ postBody[kIsSandboxKey] = @YES;
+ }
+ return postBody;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyClientResponse.h b/Firebase/Auth/Source/RPCs/FIRVerifyClientResponse.h
new file mode 100644
index 0000000..794256a
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyClientResponse.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FIRVerifyClientResponse : NSObject <FIRAuthRPCResponse>
+
+/** @property receipt
+ @brief Receipt that the APNS token was successfully validated with APNS.
+ */
+@property(nonatomic, copy, readonly, nullable) NSString *receipt;
+
+/** @property suggestedTimeOut
+ @brief The date after which delivery of the silent push notification is considered to have
+ failed.
+ */
+@property(nonatomic, copy, readonly, nullable) NSDate *suggestedTimeOutDate;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyClientResponse.m b/Firebase/Auth/Source/RPCs/FIRVerifyClientResponse.m
new file mode 100644
index 0000000..c2477d2
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyClientResponse.m
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRVerifyClientResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation FIRVerifyClientResponse
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _receipt = dictionary[@"receipt"];
+ _suggestedTimeOutDate = [dictionary[@"suggestedTimeout"] isKindOfClass:[NSString class]] ?
+ [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"suggestedTimeout"] doubleValue]] : nil;
+ return YES;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenRequest.h b/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenRequest.h
new file mode 100644
index 0000000..20f3f4d
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenRequest.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCRequest.h"
+#import "FIRIdentityToolkitRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRVerifyCustomTokenRequest
+ @brief Represents the parameters for the verifyCustomToken endpoint.
+ */
+@interface FIRVerifyCustomTokenRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property token
+ @brief The self-signed token from the client's BYOAuth server.
+ */
+@property(nonatomic, copy, readonly) NSString *token;
+
+/** @property returnSecureToken
+ @brief Whether the response should return access token and refresh token directly.
+ @remarks The default value is @c YES .
+ */
+@property(nonatomic, assign) BOOL returnSecureToken;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithToken:APIKey:
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+/** @fn initWithToken:APIKey:
+ @brief Designated initializer.
+ @param token The self-signed token from the client's BYOAuth server.
+ @param APIKey The client's API Key.
+ */
+- (nullable instancetype)initWithToken:(NSString *)token
+ APIKey:(NSString *)APIKey NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenRequest.m b/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenRequest.m
new file mode 100644
index 0000000..63d72d1
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenRequest.m
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRVerifyCustomTokenRequest.h"
+
+/** @var kVerifyCustomTokenEndpoint
+ @brief The "verifyPassword" endpoint.
+ */
+static NSString *const kVerifyCustomTokenEndpoint = @"verifyCustomToken";
+
+/** @var kTokenKey
+ @brief The key for the "token" value in the request.
+ */
+static NSString *const kTokenKey = @"token";
+
+/** @var kReturnSecureTokenKey
+ @brief The key for the "returnSecureToken" value in the request.
+ */
+static NSString *const kReturnSecureTokenKey = @"returnSecureToken";
+
+@implementation FIRVerifyCustomTokenRequest
+
+- (nullable instancetype)initWithToken:(NSString *)token
+ APIKey:(NSString *)APIKey {
+ self = [super initWithEndpoint:kVerifyCustomTokenEndpoint APIKey:APIKey];
+ if (self) {
+ _token = [token copy];
+ _returnSecureToken = YES;
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ NSMutableDictionary *body = [@{
+ kTokenKey : _token
+ } mutableCopy];
+ if (_returnSecureToken) {
+ body[kReturnSecureTokenKey] = @YES;
+ }
+ return body;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenResponse.h b/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenResponse.h
new file mode 100644
index 0000000..b8c215c
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenResponse.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRVerifyCustomTokenResponse
+ @brief Represents the response from the verifyCustomToken endpoint.
+ */
+@interface FIRVerifyCustomTokenResponse : NSObject <FIRAuthRPCResponse>
+
+/** @property IDToken
+ @brief Either an authorization code suitable for performing an STS token exchange, or the
+ access token from Secure Token Service, depending on whether @c returnSecureToken is set
+ on the request.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *IDToken;
+
+/** @property approximateExpirationDate
+ @brief The approximate expiration date of the access token.
+ */
+@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate;
+
+/** @property refreshToken
+ @brief The refresh token from Secure Token Service.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *refreshToken;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenResponse.m b/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenResponse.m
new file mode 100644
index 0000000..f86d94b
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyCustomTokenResponse.m
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRVerifyCustomTokenResponse.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+
+@implementation FIRVerifyCustomTokenResponse
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _IDToken = [dictionary[@"idToken"] copy];
+ _approximateExpirationDate = [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] ?
+ [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] : nil;
+ _refreshToken = [dictionary[@"refreshToken"] copy];
+ return YES;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyPasswordRequest.h b/Firebase/Auth/Source/RPCs/FIRVerifyPasswordRequest.h
new file mode 100644
index 0000000..ba54bce
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyPasswordRequest.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCRequest.h"
+#import "FIRIdentityToolkitRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRVerifyPasswordRequest
+ @brief Represents the parameters for the verifyPassword endpoint.
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/verifyPassword
+ */
+@interface FIRVerifyPasswordRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property email
+ @brief The email of the user.
+ */
+@property(nonatomic, copy) NSString *email;
+
+/** @property password
+ @brief The password inputed by the user.
+ */
+@property(nonatomic, copy) NSString *password;
+
+/** @property pendingIDToken
+ @brief The GITKit token for the non-trusted IDP, which is to be confirmed by the user.
+ */
+@property(nonatomic, copy, nullable) NSString *pendingIDToken;
+
+/** @property captchaChallenge
+ @brief The captcha challenge.
+ */
+@property(nonatomic, copy, nullable) NSString *captchaChallenge;
+
+/** @property captchaResponse
+ @brief Response to the captcha.
+ */
+@property(nonatomic, copy, nullable) NSString *captchaResponse;
+
+/** @property returnSecureToken
+ @brief Whether the response should return access token and refresh token directly.
+ @remarks The default value is @c YES .
+ */
+@property(nonatomic, assign) BOOL returnSecureToken;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithEmail:password:APIKey:
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+/** @fn initWithEmail:password:APIKey:
+ @brief Designated initializer.
+ @param email The email of the user.
+ @param password The password inputed by the user.
+ @param APIKey The client's API Key.
+ */
+- (nullable instancetype)initWithEmail:(NSString *)email
+ password:(NSString *)password
+ APIKey:(NSString *)APIKey NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyPasswordRequest.m b/Firebase/Auth/Source/RPCs/FIRVerifyPasswordRequest.m
new file mode 100644
index 0000000..7a9da8b
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyPasswordRequest.m
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRVerifyPasswordRequest.h"
+
+/** @var kVerifyPasswordEndpoint
+ @brief The "verifyPassword" endpoint.
+ */
+static NSString *const kVerifyPasswordEndpoint = @"verifyPassword";
+
+/** @var kEmailKey
+ @brief The key for the "email" value in the request.
+ */
+static NSString *const kEmailKey = @"email";
+
+/** @var kPasswordKey
+ @brief The key for the "password" value in the request.
+ */
+static NSString *const kPasswordKey = @"password";
+
+/** @var kPendingIDTokenKey
+ @brief The key for the "pendingIdToken" value in the request.
+ */
+static NSString *const kPendingIDTokenKey = @"pendingIdToken";
+
+/** @var kCaptchaChallengeKey
+ @brief The key for the "captchaChallenge" value in the request.
+ */
+static NSString *const kCaptchaChallengeKey = @"captchaChallenge";
+
+/** @var kCaptchaResponseKey
+ @brief The key for the "captchaResponse" value in the request.
+ */
+static NSString *const kCaptchaResponseKey = @"captchaResponse";
+
+/** @var kReturnSecureTokenKey
+ @brief The key for the "returnSecureToken" value in the request.
+ */
+static NSString *const kReturnSecureTokenKey = @"returnSecureToken";
+
+@implementation FIRVerifyPasswordRequest
+
+- (nullable instancetype)initWithEmail:(NSString *)email
+ password:(NSString *)password
+ APIKey:(NSString *)APIKey {
+ self = [super initWithEndpoint:kVerifyPasswordEndpoint APIKey:APIKey];
+ if (self) {
+ _email = [email copy];
+ _password = [password copy];
+ _returnSecureToken = YES;
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *_Nullable *_Nullable)error {
+ NSMutableDictionary *postBody = [NSMutableDictionary dictionary];
+ if (_email) {
+ postBody[kEmailKey] = _email;
+ }
+ if (_password) {
+ postBody[kPasswordKey] = _password;
+ }
+ if (_pendingIDToken) {
+ postBody[kPendingIDTokenKey] = _pendingIDToken;
+ }
+ if (_captchaChallenge) {
+ postBody[kCaptchaChallengeKey] = _captchaChallenge;
+ }
+ if (_captchaResponse) {
+ postBody[kCaptchaResponseKey] = _captchaResponse;
+ }
+ if (_returnSecureToken) {
+ postBody[kReturnSecureTokenKey] = @YES;
+ }
+ return postBody;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyPasswordResponse.h b/Firebase/Auth/Source/RPCs/FIRVerifyPasswordResponse.h
new file mode 100644
index 0000000..bed13be
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyPasswordResponse.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @class FIRVerifyPasswordResponse
+ @brief Represents the response from the verifyPassword endpoint.
+ @remarks Possible error codes:
+ - FIRAuthInternalErrorCodeUserDisabled
+ - FIRAuthInternalErrorCodeEmailNotFound
+ @see https://developers.google.com/identity/toolkit/web/reference/relyingparty/verifyPassword
+ */
+@interface FIRVerifyPasswordResponse : NSObject <FIRAuthRPCResponse>
+
+/** @property localID
+ @brief The RP local ID if it's already been mapped to the IdP account identified by the
+ federated ID.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *localID;
+
+/** @property email
+ @brief The email returned by the IdP. NOTE: The federated login user may not own the email.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *email;
+
+/** @property displayName
+ @brief The display name of the user.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *displayName;
+
+/** @property IDToken
+ @brief Either an authorization code suitable for performing an STS token exchange, or the
+ access token from Secure Token Service, depending on whether @c returnSecureToken is set
+ on the request.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *IDToken;
+
+/** @property approximateExpirationDate
+ @brief The approximate expiration date of the access token.
+ */
+@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate;
+
+/** @property refreshToken
+ @brief The refresh token from Secure Token Service.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *refreshToken;
+
+/** @property photoURL
+ @brief The URI of the public accessible profile picture.
+ */
+@property(nonatomic, strong, readonly, nullable) NSURL *photoURL;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyPasswordResponse.m b/Firebase/Auth/Source/RPCs/FIRVerifyPasswordResponse.m
new file mode 100644
index 0000000..4d0ca10
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyPasswordResponse.m
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRVerifyPasswordResponse.h"
+
+#import "../Private/FIRAuthErrorUtils.h"
+
+@implementation FIRVerifyPasswordResponse
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _localID = [dictionary[@"localId"] copy];
+ _email = [dictionary[@"email"] copy];
+ _displayName = [dictionary[@"displayName"] copy];
+ _IDToken = [dictionary[@"idToken"] copy];
+ _approximateExpirationDate = [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] ?
+ [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] : nil;
+ _refreshToken = [dictionary[@"refreshToken"] copy];
+ _photoURL = dictionary[@"photoUrl"] ? [NSURL URLWithString:dictionary[@"photoUrl"]] : nil;
+ return YES;
+}
+
+@end
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberRequest.h b/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberRequest.h
new file mode 100644
index 0000000..06039b9
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberRequest.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRIdentityToolkitRequest.h"
+
+#import "FIRAuthRPCRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FIRVerifyPhoneNumberRequest : FIRIdentityToolkitRequest <FIRAuthRPCRequest>
+
+/** @property verificationID
+ @brief The verification ID obtained from the response of @c sendVerificationCode.
+*/
+@property(nonatomic, readonly, nullable) NSString *verificationID;
+
+/** @property verificationCode
+ @brief The verification code provided by the user.
+*/
+@property(nonatomic, readonly, nullable) NSString *verificationCode;
+
+/** @property accessToken
+ @brief The STS Access Token for the authenticated user.
+ */
+@property(nonatomic, copy, nullable) NSString *accessToken;
+
+/** @var temporaryProof
+ @brief The a temporary proof code pertaining to this credentil, returned from the backend.
+ */
+@property(nonatomic, readonly, nonnull) NSString *temporaryProof;
+
+/** @var phoneNumber
+ @brief The a phone number pertaining to this credential, returned from the backend.
+ */
+@property(nonatomic, readonly, nonnull) NSString *phoneNumber;
+
+/** @fn initWithEndpoint:APIKey:
+ @brief Please use initWithPhoneNumber:APIKey:
+ */
+- (nullable instancetype)initWithEndpoint:(NSString *)endpoint
+ APIKey:(NSString *)APIKey NS_UNAVAILABLE;
+
+/** @fn initWithTemporaryProof:phoneNumberAPIKey
+ @brief Designated initializer.
+ @param temporaryProof The temporary proof sent by the backed.
+ @param phoneNumber The phone number associated with the credential to be signed in.
+ @param APIKey The client's API Key.
+ */
+- (nullable instancetype)initWithTemporaryProof:(NSString *)temporaryProof
+ phoneNumber:(NSString *)phoneNumber
+ APIKey:(NSString *)APIKey NS_DESIGNATED_INITIALIZER;
+
+/** @fn initWithVerificationID:verificationCode:APIKey
+ @brief Designated initializer.
+ @param verificationID The verification ID obtained from the response of @c sendVerificationCode.
+ @param verificationCode The verification code provided by the user.
+ @param APIKey The client's API Key.
+ */
+- (nullable instancetype)initWithVerificationID:(NSString *)verificationID
+ verificationCode:(NSString *)verificationCode
+ APIKey:(NSString *)APIKey NS_DESIGNATED_INITIALIZER;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberRequest.m b/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberRequest.m
new file mode 100644
index 0000000..b3d1054
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberRequest.m
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRVerifyPhoneNumberRequest.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/** @var kVerifyPhoneNumberEndPoint
+ @brief The "verifyPhoneNumber" endpoint.
+ */
+static NSString *const kVerifyPhoneNumberEndPoint = @"verifyPhoneNumber";
+
+/** @var kVerificationIDKey
+ @brief The key for the verification ID parameter in the request.
+ */
+static NSString *const kVerificationIDKey = @"sessionInfo";
+
+/** @var kVerificationCodeKey
+ @brief The key for the verification code parameter in the request.
+ */
+static NSString *const kVerificationCodeKey = @"code";
+
+/** @var kIDTokenKey
+ @brief The key for the "ID Token" value in the request.
+ */
+static NSString *const kIDTokenKey = @"idToken";
+
+/** @var kTemporaryProofKey
+ @brief The key for the temporary proof value in the request.
+ */
+static NSString *const kTemporaryProofKey = @"temporaryProof";
+
+/** @var kPhoneNumberKey
+ @brief The key for the phone number value in the request.
+ */
+static NSString *const kPhoneNumberKey = @"phoneNumber";
+
+@implementation FIRVerifyPhoneNumberRequest
+
+- (nullable instancetype)initWithTemporaryProof:(NSString *)temporaryProof
+ phoneNumber:(NSString *)phoneNumber
+ APIKey:(NSString *)APIKey {
+ self = [super initWithEndpoint:kVerifyPhoneNumberEndPoint APIKey:APIKey];
+ if (self) {
+ _temporaryProof = [temporaryProof copy];
+ _phoneNumber = [phoneNumber copy];
+ }
+ return self;
+}
+
+- (nullable instancetype)initWithVerificationID:(NSString *)verificationID
+ verificationCode:(NSString *)verificationCode
+ APIKey:(NSString *)APIKey {
+ self = [super initWithEndpoint:kVerifyPhoneNumberEndPoint APIKey:APIKey];
+ if (self) {
+ _verificationID = verificationID;
+ _verificationCode = verificationCode;
+ }
+ return self;
+}
+
+- (nullable id)unencodedHTTPRequestBodyWithError:(NSError *__autoreleasing _Nullable *)error {
+ NSMutableDictionary *postBody = [NSMutableDictionary dictionary];
+ if (_verificationID) {
+ postBody[kVerificationIDKey] = _verificationID;
+ }
+ if (_verificationCode) {
+ postBody[kVerificationCodeKey] = _verificationCode;
+ }
+ if (_accessToken) {
+ postBody[kIDTokenKey] = _accessToken;
+ }
+ if (_temporaryProof) {
+ postBody[kTemporaryProofKey] = _temporaryProof;
+ }
+ if (_phoneNumber) {
+ postBody[kPhoneNumberKey] = _phoneNumber;
+ }
+ return postBody;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberResponse.h b/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberResponse.h
new file mode 100644
index 0000000..f8f4ba2
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberResponse.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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>
+
+#import "FIRAuthRPCResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FIRVerifyPhoneNumberResponse : NSObject <FIRAuthRPCResponse>
+
+/** @property IDToken
+ @brief Either an authorization code suitable for performing an STS token exchange, or the
+ access token from Secure Token Service, depending on whether @c returnSecureToken is set
+ on the request.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *IDToken;
+
+/** @property refreshToken
+ @brief The refresh token from Secure Token Service.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *refreshToken;
+
+/** @property localID
+ @brief The Firebear user ID.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *localID;
+
+/** @property phoneNumber
+ @brief The verified phone number.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *phoneNumber;
+
+/** @property temporaryProof
+ @brief The temporary proof code returned by the backend.
+ */
+@property(nonatomic, strong, readonly, nullable) NSString *temporaryProof;
+
+/** @property isNewUser
+ @brief Flag indicating that the user signing in is a new user and not a returning user.
+ */
+@property(nonatomic, assign) BOOL isNewUser;
+
+/** @property approximateExpirationDate
+ @brief The approximate expiration date of the access token.
+ */
+@property(nonatomic, copy, readonly, nullable) NSDate *approximateExpirationDate;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberResponse.m b/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberResponse.m
new file mode 100644
index 0000000..acba2c2
--- /dev/null
+++ b/Firebase/Auth/Source/RPCs/FIRVerifyPhoneNumberResponse.m
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2017 Google
+ *
+ * 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 "FIRVerifyPhoneNumberResponse.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation FIRVerifyPhoneNumberResponse
+
+- (nullable NSString *)expectedKind {
+ return nil;
+}
+
+- (BOOL)setWithDictionary:(NSDictionary *)dictionary
+ error:(NSError *_Nullable *_Nullable)error {
+ _IDToken = [dictionary[@"idToken"] copy];
+ _refreshToken = [dictionary[@"refreshToken"] copy];
+ _isNewUser = [dictionary[@"isNewUser"] boolValue];
+ _localID = [dictionary[@"localId"] copy];
+ _phoneNumber = [dictionary[@"phoneNumber"] copy];
+ _temporaryProof = [dictionary[@"temporaryProof"] copy];
+ _approximateExpirationDate = [dictionary[@"expiresIn"] isKindOfClass:[NSString class]] ?
+ [NSDate dateWithTimeIntervalSinceNow:[dictionary[@"expiresIn"] doubleValue]] : nil;
+ return YES;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END