Example #1
0
        public async Task <IActionResult> FacebookLogin([FromBody] FacebookLoginViewModel info)
        {
            #region Request parameters validation

            // Information hasn't been initialized.
            if (info == null)
            {
                info = new FacebookLoginViewModel();
                TryValidateModel(info);
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            #endregion

            #region Facebook login & token generate

            // Do facebook login.
            var user = await _userDomain.FacebookLoginAsync(info);

            // Initialize access token.
            var jsonWebToken = _userDomain.GenerateJwt(user);

            #endregion

            return(Ok(jsonWebToken));
        }
Example #2
0
        /// <summary>
        ///     <inheritdoc />
        /// </summary>
        /// <param name="model"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public virtual async Task <User> FacebookLoginAsync(FacebookLoginViewModel model,
                                                            CancellationToken cancellationToken = default(CancellationToken))
        {
            // Find token information.
            var tokenInfo = await _externalAuthenticationService.GetFacebookTokenInfoAsync(model.AccessToken);

            if (tokenInfo == null || string.IsNullOrWhiteSpace(tokenInfo.AccessToken))
            {
                throw new ApiException(HttpMessages.FacebookCodeIsInvalid, HttpStatusCode.Forbidden);
            }

            // Get the profile information.
            var profile = await _externalAuthenticationService.GetFacebookBasicProfileAsync(tokenInfo.AccessToken);

            if (profile == null)
            {
                throw new ApiException(HttpMessages.GoogleCodeIsInvalid, HttpStatusCode.Forbidden);
            }


            // Find accounts by searching for email address.
            var accounts = _unitOfWork.Users.Search();

            accounts = accounts.Where(x => x.Email.Equals(profile.Email));

            // Get the first matched account.
            var account = await accounts.FirstOrDefaultAsync(cancellationToken);

            // Account is available in the system. Check its status.
            if (account != null)
            {
                // Prevent account from logging into system because it is pending.
                if (account.Status == UserStatus.Pending)
                {
                    throw new ApiException(HttpMessages.AccountIsPending, HttpStatusCode.Forbidden);
                }

                // Prevent account from logging into system because it is deleted.
                if (account.Status == UserStatus.Disabled)
                {
                    throw new ApiException(HttpMessages.AccountIsPending, HttpStatusCode.Forbidden);
                }
            }
            else
            {
                // Initialize account instance.
                account            = new User();
                account.Email      = profile.Email;
                account.Nickname   = profile.FullName;
                account.Role       = UserRole.User;
                account.JoinedTime = _baseTimeService.DateTimeUtcToUnix(DateTime.UtcNow);
                account.Type       = UserKind.Facebook;

                // Add account to database.
                _unitOfWork.Users.Insert(account);
                await _unitOfWork.CommitAsync(cancellationToken);
            }

            return(account);
        }
Example #3
0
        public async Task <ActionResult> ExternalLoginConfirmation(FacebookLoginViewModel model, string returnUrl)
        {
            if (User.Identity.IsAuthenticated)
            {
                return(new HttpStatusCodeResult(200));
            }

            if (!ModelState.IsValid)
            {
                return(new HttpStatusCodeResult(400));
            }
            var user = new ApplicationUser
            {
                UserName  = model.Email,
                Email     = model.Email,
                BirthDate = model.BirthDate,
            };
            var manager = new UserManager <ApplicationUser>(new UserStore <ApplicationUser>(new ApplicationDbContext()));
            var result  = await manager.CreateAsync(user);

            if (result.Succeeded)
            {
                result = await manager.AddLoginAsync(user.Id, new UserLoginInfo("Facebook", "155273308418309"));

                if (result.Succeeded)
                {
                    return(Json(new
                    {
                        id = user.Id,
                        email = user.Email
                    }));
                }
            }
            return(Json(new
            {
                id = 1,
                email = "admin",
            }));
        }
        public async Task <IActionResult> LoginFacebook([FromBody] FacebookLoginViewModel flvm)
        {
            Log.Info("Facebook login flow started");

            if (string.IsNullOrEmpty(flvm.userid) || string.IsNullOrEmpty(flvm.firstName))
            {
                return(BadRequest(ResponseViewModel.GetErrorModel("Missing Parameters")));
            }

            User user = await _lService.LoginFacebook(flvm.userid);

            if (string.IsNullOrEmpty(user.FirstName))
            {
                //TODO handle this in another way.
                //used to catch cast errors in .LoginFacebook
                return(BadRequest(ResponseViewModel.GetErrorModel("Could not log facebook user in.")));
            }
            else if (user != null)
            {
                // user exists
                return(Ok(ResponseViewModel.GetSuccessModel("Facebook user was logged in.")));
            }

            //User doesnt exist, create it.
            user = await _uService.CreateFacebookUser(flvm.userid, flvm.firstName);

            if (user == null)
            {
                string msg = "Could not create facebook user.";
                Log.Warn(msg);
                return(BadRequest(ResponseViewModel.GetSuccessModel(msg)));
            }

            //Response
            Log.Info("Login flow Succes");
            return(Ok(ResponseViewModel.GetSuccessModel("Facebook user was created and logged in.")));
        }