public async Task <ActionResult <LoginResponseDto> > ConfirmSocialLogin([FromBody] SocialLoginDto model) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var user = await _userService.GetUserByEmail(model.Email); if (user != null) { var token = GenerateToken(user.User); var loginResult = new LoginResponseDto(); loginResult.Token = new JwtSecurityTokenHandler().WriteToken(token); loginResult.User = user.User; loginResult.CreatedDebates = user.CreatedDebates; loginResult.ParticipatingDebates = user.ParticipatingDebates; return(Ok(loginResult)); } else { bool created = await _userService.Register(model.Email); if (!created) { return(BadRequest("Unable to create user")); } user = await _userService.GetUserByEmail(model.Email); var token = GenerateToken(user.User); var loginResult = new LoginResponseDto(); loginResult.Token = new JwtSecurityTokenHandler().WriteToken(token); loginResult.User = user.User; return(Created("/auth/social", loginResult)); } }
public async Task <IActionResult> Apple(SocialLoginDto apple) { if (!ModelState.IsValid) { return(CustomResponse(ModelState)); } var privateKey = System.IO.File.ReadAllText("path/to/file.p8"); var provider = new AppleAuthProvider("MyClientID", "MyTeamID", "MyKeyID", "https://myredirecturl.com/HandleResponseFromApple", "SomeState"); var appleRefreshToken = await provider.GetRefreshToken(apple.AccessToken, privateKey); var user = await AuthenticationService.UserManager.FindByEmailAsync(appleRefreshToken.UserInformation.Email); if (user == null) { user = new User { UserName = apple.UserName, Email = apple.Email }; var result = await AuthenticationService.UserManager.CreateAsync(user, Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8)); if (result.Succeeded) { user = await AuthenticationService.UserManager.FindByEmailAsync(user.Email); await AuthenticationService.SignInManager.SignInAsync(user, false); var response = await AuthenticationService.GetUserLoginResponse(user); return(CustomResponse(response)); } foreach (var error in result.Errors) { NotificateError(error.Description); } return(CustomResponse()); } else { await AuthenticationService.SignInManager.SignInAsync(user, false); var response = await AuthenticationService.GetUserLoginResponse(user); return(CustomResponse(response)); } }
public async Task <IActionResult> Facebook(SocialLoginDto facebook) { if (!ModelState.IsValid) { return(CustomResponse(ModelState)); } // 1.generate an app access token var appAccessTokenResponse = await new HttpClient().GetStringAsync($"https://graph.facebook.com/oauth/access_token?client_id={FacebookAuthSettings.AppId}&client_secret={FacebookAuthSettings.AppSecret}&grant_type=client_credentials"); var appAccessToken = JsonConvert.DeserializeObject <FacebookAppAccessToken>(appAccessTokenResponse); // 2. validate the user access token var userAccessTokenValidationResponse = await new HttpClient().GetStringAsync($"https://graph.facebook.com/debug_token?input_token={facebook.AccessToken}&access_token={appAccessToken.AccessToken}"); var userAccessTokenValidation = JsonConvert.DeserializeObject <FacebookUserAccessTokenValidation>(userAccessTokenValidationResponse); if (!userAccessTokenValidation.Data.IsValid) { NotificateError("Token inválido."); return(CustomResponse()); } // 3. we've got a valid token so we can request user data from fb var userInfoResponse = await new HttpClient().GetStringAsync($"https://graph.facebook.com/v10.0/me?fields=id,email,name,picture&access_token={facebook.AccessToken}"); var userInfo = JsonConvert.DeserializeObject <FacebookUserData>(userInfoResponse); // 4. ready to create the local user account (if necessary) and jwt var user = await AuthenticationService.UserManager.FindByEmailAsync(userInfo.Email); if (user == null) { user = new User { UserName = userInfo.Name, Email = userInfo.Email, AvatarUrl = userInfo.Picture.Data.Url }; var result = await AuthenticationService.UserManager.CreateAsync(user, Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8)); if (result.Succeeded) { user = await AuthenticationService.UserManager.FindByEmailAsync(user.Email); await AuthenticationService.SignInManager.SignInAsync(user, false); var response = await AuthenticationService.GetUserLoginResponse(user); return(CustomResponse(response)); } foreach (var error in result.Errors) { NotificateError(error.Description); } return(CustomResponse()); } else { await AuthenticationService.SignInManager.SignInAsync(user, false); var response = await AuthenticationService.GetUserLoginResponse(user); return(CustomResponse(response)); } }