public async Task <(IUserAuth, Exception)> Login(ICloudAuthOptions options = null) { try { if (!_inited) { await new WaitUntil(() => _inited); } if (!_currentUser.IsNull()) { return(_currentUser, null); } var googleUser = await Google.GoogleSignIn.DefaultInstance.SignIn(); _currentUser = new CloudAuthUser() { authType = CloudAuthType.GoogleSignIn, id = googleUser.UserId, imageUrl = googleUser.ImageUrl.ToString(), name = googleUser.DisplayName, token = googleUser.IdToken, email = googleUser.Email }; return(_currentUser, null); } catch (Exception ex) { return(null, ex); } }
public async Task <(IUserAuth, Exception)> Login(ICloudAuthOptions options = null) { try { if (!_inited) { await new WaitUntil(() => _inited); } if (!_currentUser.IsNull()) { return(_currentUser, null); } var perms = new string[] { "public_profile", "email" }; var accessToken = default(string); var errorMessage = default(string); if (!FB.IsLoggedIn) { var complete = false; FB.LogInWithReadPermissions(perms, (result) => { errorMessage = result.Error; accessToken = result.AccessToken.TokenString; complete = true; }); await new WaitUntil(() => complete); } else { accessToken = AccessToken.CurrentAccessToken.TokenString; } if (FB.IsLoggedIn) { var isError = false; errorMessage = string.Empty; var id = string.Empty; var name = string.Empty; var picture = string.Empty; var email = string.Empty; var complete = false; FB.API("/me?fields=id,name,picture,email", HttpMethod.GET, graphResult => { if (!graphResult.Error.IsNullOrEmpty() || graphResult.Cancelled) { isError = true; errorMessage = graphResult.Error; } else { var dic = graphResult.ResultDictionary; var key = nameof(id); if (dic.ContainsKey(key)) { id = dic[key].ToString(); } key = nameof(name); if (dic.ContainsKey(key)) { name = dic[key].ToString(); } key = nameof(email); if (dic.ContainsKey(key)) { email = dic[key].ToString(); } key = nameof(picture); if (dic.ContainsKey(key)) { dic = dic[key] as Dictionary <string, object>; key = "data"; if (!dic.IsNull() && dic.ContainsKey(key)) { dic = dic[key] as Dictionary <string, object>; key = "url"; if (!dic.IsNull() && dic.ContainsKey(key)) { picture = dic[key].ToString(); } } } } complete = true; }); await new WaitUntil(() => complete); if (isError) { return(null, new Exception(errorMessage)); } else { _currentUser = new CloudAuthUser() { id = id, authType = CloudAuthType.Facebook, imageUrl = picture, name = name, token = accessToken, email = email }; return(_currentUser, null); } } else { return(default(IUserAuth), new Exception(errorMessage)); } } catch (System.Exception ex) { return(null, ex); } }
public async Task <(IUserAuth, Exception)> Login(ICloudAuthOptions options) { try { if (!_inited) { await new WaitUntil(() => _inited); } if (!_currentUser.IsNull()) { return(_currentUser, null); } var authtype = options.GetOptions <FirebaseCloudAuthType>(FirebaseCloudAuthOptions.LOGIN_TYPE); if (authtype.IsNull() || authtype == FirebaseCloudAuthType.None) { return(null, new ArgumentNullException(nameof(authtype))); } switch (authtype) { case FirebaseCloudAuthType.EmailPassword: { var email = options.GetOptions <string>(FirebaseCloudAuthOptions.EMAIL); var password = options.GetOptions <string>(FirebaseCloudAuthOptions.PASSWORD); if (email.IsNullOrEmpty()) { return(null, new ArgumentNullException(FirebaseCloudAuthOptions.EMAIL, "Email is Empty")); } if (password.IsNullOrEmpty()) { return(null, new ArgumentNullException(FirebaseCloudAuthOptions.PASSWORD, "Password is Empty")); } //Check email registered var providers = await FirebaseAuth.DefaultInstance.FetchProvidersForEmailAsync(email); if (providers.IsNullOrEmpty()) { return(null, new FirebaseException(401, "Not Registered")); } var firebaseUser = await FirebaseAuth.DefaultInstance.SignInWithEmailAndPasswordAsync(email, password); var accessToken = await firebaseUser.TokenAsync(false); _currentUser = new CloudAuthUser() { id = firebaseUser.UserId, authType = CloudAuthType.Firebase, imageUrl = firebaseUser.PhotoUrl?.AbsoluteUri, name = firebaseUser.DisplayName, email = firebaseUser.Email, token = accessToken }; return(_currentUser, null); } #if GOOGLE_AUTH case FirebaseCloudAuthType.GoogleSignIn: { var accessToken = options.GetOptions <string>(FirebaseCloudAuthOptions.TOKEN); var credential = GoogleAuthProvider.GetCredential(accessToken, null); var firebaseUser = await FirebaseAuth.DefaultInstance.SignInWithCredentialAsync(credential); accessToken = await firebaseUser.TokenAsync(false); _currentUser = new CloudAuthUser() { id = firebaseUser.UserId, authType = CloudAuthType.Firebase, imageUrl = firebaseUser.PhotoUrl?.AbsoluteUri, name = firebaseUser.DisplayName, email = firebaseUser.Email, token = accessToken }; return(_currentUser, null); } #endif #if FACEBOOK_AUTH case FirebaseCloudAuthType.Facebook: { var accessToken = options.GetOptions <string>(FirebaseCloudAuthOptions.TOKEN); var credential = FacebookAuthProvider.GetCredential(accessToken); var firebaseUser = await FirebaseAuth.DefaultInstance.SignInWithCredentialAsync(credential); accessToken = await firebaseUser.TokenAsync(false); _currentUser = new CloudAuthUser() { id = firebaseUser.UserId, authType = CloudAuthType.Firebase, imageUrl = firebaseUser.PhotoUrl?.AbsoluteUri, name = firebaseUser.DisplayName, token = accessToken, email = firebaseUser.Email }; return(_currentUser, null); } #endif #if PLAYSERVICE_AUTH case FirebaseCloudAuthType.GooglePlayService: { var accessToken = options.GetOptions <string>(FirebaseCloudAuthOptions.TOKEN); var credential = PlayGamesAuthProvider.GetCredential(accessToken); var firebaseUser = await FirebaseAuth.DefaultInstance.SignInWithCredentialAsync(credential); accessToken = await firebaseUser.TokenAsync(false); _currentUser = new CloudAuthUser() { id = firebaseUser.UserId, authType = CloudAuthType.Firebase, imageUrl = firebaseUser.PhotoUrl?.AbsoluteUri, name = firebaseUser.DisplayName, token = accessToken, email = firebaseUser.Email }; return(_currentUser, null); } #endif default: { return(null, new Exception("Auth Type Currently Not Supported")); } } } catch (FirebaseException ex) { return(null, ex); } }