/// <summary> /// Using the idToken of an authenticated user, get the details of the user's account /// This will method possibly will return 400 bad request for social media logins like facebook, twitter because firebase doesn't store user information /// </summary> /// <param name="firebaseToken"> The FirebaseToken (idToken) of an authenticated user. </param> /// <returns> The <see cref="User"/>. </returns> public async Task <User> GetUserAsync(string firebaseToken) { var content = $"{{\"idToken\":\"{firebaseToken}\"}}"; var responseData = "N/A"; try { var stringContent = new StringContent(content, Encoding.UTF8, "application/json"); stringContent = GetHeaders(null, stringContent); var response = await this.client.PostAsync(new Uri(string.Format(GoogleGetUser, this.authConfig.ApiKey)), stringContent).ConfigureAwait(false); responseData = await response.Content.ReadAsStringAsync().ConfigureAwait(false); response.EnsureSuccessStatusCode(); var resultJson = JObject.Parse(responseData); var user = JsonConvert.DeserializeObject <User>(resultJson["users"].First().ToString()); return(user); } catch (Exception ex) { AuthErrorReason errorReason = GetFailureReason(responseData); throw new FirebaseAuthException(GoogleDeleteUserUrl, content, responseData, ex, errorReason); } }
private async Task <FirebaseAuthLink> ExecuteWithPostContentAsync(string googleUrl, string postContent) { string responseData = "N/A"; try { var response = await this.client.PostAsync(new Uri(string.Format(googleUrl, this.authConfig.ApiKey)), new StringContent(postContent, Encoding.UTF8, "application/json")).ConfigureAwait(false); responseData = await response.Content.ReadAsStringAsync().ConfigureAwait(false); response.EnsureSuccessStatusCode(); var user = JsonConvert.DeserializeObject <User>(responseData); var auth = JsonConvert.DeserializeObject <FirebaseAuthLink>(responseData); auth.AuthProvider = this; auth.User = user; return(auth); } catch (Exception ex) { AuthErrorReason errorReason = GetFailureReason(responseData); throw new FirebaseAuthException(googleUrl, postContent, responseData, ex, errorReason); } }
public FirebaseAuthException(string requestUrl, string requestData, string responseData, Exception innerException, AuthErrorReason reason = AuthErrorReason.Undefined) : base(GenerateExceptionMessage(requestUrl, requestData, responseData, reason), innerException) { RequestUrl = requestUrl; RequestData = requestData; ResponseData = responseData; Reason = reason; }
/// <summary> /// Deletes the user with a recent Firebase Token. /// </summary> /// <param name="token"> Recent Firebase Token. </param> public async Task DeleteUserAsync(string firebaseToken) { var content = $"{{ \"idToken\": \"{firebaseToken}\" }}"; var responseData = "N/A"; try { var response = await this.client.PostAsync(new Uri(string.Format(GoogleDeleteUserUrl, this.authConfig.ApiKey)), new StringContent(content, Encoding.UTF8, "application/json")).ConfigureAwait(false); responseData = await response.Content.ReadAsStringAsync().ConfigureAwait(false); response.EnsureSuccessStatusCode(); } catch (Exception ex) { AuthErrorReason errorReason = GetFailureReason(responseData); throw new FirebaseAuthException(GoogleDeleteUserUrl, content, responseData, ex, errorReason); } }
/// <summary> /// Sends user an email with a link to reset his password. /// </summary> /// <param name="email"> The email. </param> public async Task SendPasswordResetEmailAsync(string email) { var content = $"{{\"requestType\":\"PASSWORD_RESET\",\"email\":\"{email}\"}}"; var responseData = "N/A"; try { var response = await this.client.PostAsync(new Uri(string.Format(GoogleGetConfirmationCodeUrl, this.authConfig.ApiKey)), new StringContent(content, Encoding.UTF8, "application/json")).ConfigureAwait(false); responseData = await response.Content.ReadAsStringAsync().ConfigureAwait(false); response.EnsureSuccessStatusCode(); } catch (Exception ex) { AuthErrorReason errorReason = GetFailureReason(responseData); throw new FirebaseAuthException(GoogleGetConfirmationCodeUrl, content, responseData, ex, errorReason); } }
/// <summary> /// Sends user an email with a link to verify his email address. /// </summary> /// <param name="firebaseToken"> The FirebaseToken (idToken) of an authenticated user. </param> public async Task <bool> SendEmailVerificationAsync(string firebaseToken, string locale = null) { string responseData = "N/A"; string content = $"{{\"requestType\":\"VERIFY_EMAIL\",\"idToken\":\"{firebaseToken}\"}}"; try { var stringContent = new StringContent(content, Encoding.UTF8, "application/json"); stringContent = GetHeaders(null, stringContent); HttpResponseMessage response = await client.PostAsync(new Uri(string.Format(GoogleGetConfirmationCodeUrl, authConfig.ApiKey)), stringContent).ConfigureAwait(false); responseData = await response.Content.ReadAsStringAsync(); response.EnsureSuccessStatusCode(); return(response.StatusCode == System.Net.HttpStatusCode.OK); } catch (Exception ex) { AuthErrorReason errorReason = GetFailureReason(responseData); throw new FirebaseAuthException(GoogleGetConfirmationCodeUrl, content, responseData, ex, errorReason); } }
private static string GenerateExceptionMessage(string requestUrl, string requestData, string responseData, AuthErrorReason errorReason) { return($"Exception occured while authenticating.\nUrl: {requestUrl}\nRequest Data: {requestData}\nResponse: {responseData}\nReason: {errorReason}"); }
public AuthError(AuthErrorReason reason) { Reason = reason; }
public AuthError(AuthErrorReason reason, Exception innerException) : base(reason.ToString(), innerException) { Reason = reason; }
public string ConvertErrorCode(AuthErrorReason reason) { switch (reason) { case AuthErrorReason.Undefined: break; case AuthErrorReason.OperationNotAllowed: break; case AuthErrorReason.UserDisabled: break; case AuthErrorReason.UserNotFound: break; case AuthErrorReason.InvalidProviderID: break; case AuthErrorReason.InvalidAccessToken: break; case AuthErrorReason.LoginCredentialsTooOld: break; case AuthErrorReason.MissingRequestURI: break; case AuthErrorReason.SystemError: break; case AuthErrorReason.InvalidEmailAddress: return(ErrorCodes.INVALID_EMAIL); case AuthErrorReason.MissingPassword: return(ErrorCodes.MISSING_PASSWORD); case AuthErrorReason.WeakPassword: return(ErrorCodes.WEAK_PASSWORD); case AuthErrorReason.EmailExists: return(ErrorCodes.ACCOUNT_EXISTS); case AuthErrorReason.MissingEmail: return(ErrorCodes.MISSING_EMAIL); case AuthErrorReason.UnknownEmailAddress: return(ErrorCodes.WRONG_ACCOUNT); case AuthErrorReason.WrongPassword: return(ErrorCodes.WRONG_PASSWORD); case AuthErrorReason.TooManyAttemptsTryLater: break; case AuthErrorReason.MissingRequestType: break; case AuthErrorReason.ResetPasswordExceedLimit: break; case AuthErrorReason.InvalidIDToken: return(ErrorCodes.INVALID_TOKEN); case AuthErrorReason.MissingIdentifier: break; case AuthErrorReason.InvalidIdentifier: break; case AuthErrorReason.AlreadyLinked: break; default: break; } return(ErrorCodes.UNKNOWN_ERROR); }