public bool Authenticate(FacebookAuthToken token)
 {
     if (token?.Token != null)
     {
         return(token.Token == "facebook");
     }
     return(false);
 }
Exemplo n.º 2
0
        public async Task <IActionResult> FacebookAuth([FromBody] FacebookAuthToken model)
        {
            _logger.LogDebug($"Attempting Facebook auth - token: {model.Token}");
            var client = new HttpClient();

            var appAccessTokenResponse = await client.GetStringAsync($"https://graph.facebook.com/oauth/access_token?client_id={_facebookOptions.AppId}&client_secret={_facebookOptions.AppSecret}&grant_type=client_credentials");

            var appAccessToken = JsonConvert.DeserializeObject <FacebookAppAccessToken>(appAccessTokenResponse);

            _logger.LogDebug($"Facebook access token recieved.");

            var userAccessTokenValidationResponse = await client.GetStringAsync($"https://graph.facebook.com/debug_token?input_token={model.Token}&access_token={appAccessToken.AccessToken}");

            var userAccessTokenValidation = JsonConvert.DeserializeObject <FacebookUserAccessTokenValidation>(userAccessTokenValidationResponse);

            if (!userAccessTokenValidation.Data.IsValid)
            {
                _logger.LogDebug($"Facebook access token validation failed.");
                ModelState.AddModelError("login_failure", "Invalid facebook token.");
                return(BadRequest(ModelState));
            }
            _logger.LogDebug($"Facebook access token validated.");

            var userInfoResponse = await client.GetStringAsync($"https://graph.facebook.com/v3.2/me?fields=id,email,first_name,last_name,name,gender,locale,birthday,picture&access_token={model.Token}");

            var userInfo = JsonConvert.DeserializeObject <FacebookUserData>(userInfoResponse);

            _logger.LogDebug($"Facebook user info recieved for user {userInfo.Email}");

            var result = await _signInManager.ExternalLoginSignInAsync("facebook", userAccessTokenValidation.Data.UserId.ToString(), isPersistent : false, bypassTwoFactor : true);

            AppUser appUser;

            if (result.Succeeded)
            {
                _logger.LogDebug($"Facebook sign in successful. Retriving application user.");
                appUser = _userManager.Users.SingleOrDefault(r => r.Email == userInfo.Email);
                _logger.LogDebug($"AppUser: {appUser.Email}");
            }
            else
            {
                if (result.IsLockedOut || result.IsNotAllowed)
                {
                    _logger.LogDebug($"User forbidden.");
                    return(Forbid());
                }

                //No account
                _logger.LogDebug($"No account. Registering user.");
                appUser = new AppUser {
                    UserName = userInfo.Email, Email = userInfo.Email
                };
                var idResult = await _userManager.CreateAsync(appUser);

                if (idResult.Succeeded)
                {
                    _logger.LogDebug($"Storing Facebook credentials.");
                    idResult = await _userManager.AddLoginAsync(appUser, new UserLoginInfo("facebook", userAccessTokenValidation.Data.UserId.ToString(), userInfo.Name));

                    if (idResult.Succeeded)
                    {
                        _logger.LogDebug($"Credentials stored. Signing user in.");
                        await _signInManager.SignInAsync(appUser, isPersistent : false);
                    }
                }
            }

            _logger.LogDebug($"Retrieving user claims");
            var claims = await _userManager.GetClaimsAsync(appUser);

            var identity = new ClaimsIdentity(claims);

            _logger.LogDebug($"Login successful.");
            return(Ok(new JwtToken
            {
                Id = appUser.Id,
                Token = await _jwtService.GenerateEncodedToken(appUser.UserName, identity),
                ExpiresIn = (int)_jwtOptions.ValidFor.TotalSeconds
            }));
        }