private async Task<IdentityResult> RegisterExternalUser(ExternalLoginDetails details) { IdentityResult result; var user = await _userManager.FindByEmailAsync(details.Email); if (user == null) { user = new ApplicationUser() { UserName = details.Email, Email = details.Email, EmailConfirmed = true, AccessFailedCount = 0, }; result = await _userManager.CreateAsync(user); if (!result.Succeeded) { return result; } } result = await _userManager.AddLoginAsync(user, details.Login); return result; }
//private OAuth2Helper GetSuitableHelper(LocalAccessTokenRequest request) //{ // var provider = request.RedirectUri.Replace("https://votify.", string.Empty).Replace("/", string.Empty); // switch(provider) // { // case "google": // // return GoogleHelper.Instance(request.ClientId); // case "facebook": // // return FacebookHelper.Instance(request.ClientId); // case "linkedin": // // return LinkedinHelper.Instance(request.ClientId); // default: // return null; // } //} //[AllowAnonymous] //[HttpPost] //[Route("ObtainLocalAccessToken")] //public async Task<IActionResult> ObtainLocalAccessToken(LocalAccessTokenRequest request) //{ // if (!ModelState.IsValid) // { // return HttpBadRequest(ModelState); // } // var helper = GetSuitableHelper(request); // var userInfo = await helper.GetExternalLoginDetails(request.AuthorizationCode); // if (userInfo == null) // { // ModelState.AddModelError("", "Could not connect to your account"); // return HttpBadRequest(ModelState); // } // if (string.IsNullOrEmpty(userInfo.Email)) // { // ModelState.AddModelError("", "There was no email address connected to this account"); // return HttpBadRequest(ModelState); // } // return await BuildAccessTokenResponse(userInfo); //} private async Task<IActionResult> BuildAccessTokenResponse(ExternalLoginDetails details) { try { IdentityUser user = await _userManager.FindByLoginAsync(details.Login.LoginProvider, details.Login.ProviderKey); if (user == null) { var result = await RegisterExternalUser(details); if (!result.Succeeded) { return GenerateErrorResult(result); } user = await _userManager.FindByEmailAsync(user.Email); } JObject accessTokenResponse = new JObject(); // AuthHelper.GenerateLocalAccessTokenResponse(user.UserName); return Ok(accessTokenResponse); } catch (Exception ex) { ModelState.AddModelError("", "Could not connect to your account"); return HttpBadRequest(ModelState); } }