Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
            }
        }