public async Task <IActionResult> Facebook([FromBody] FacebookAuthDto dto) { // 1.generate an app access token var appAccessTokenResponse = await Client.GetStringAsync($"https://graph.facebook.com/oauth/access_token?client_id={_fbAuthSettings.AppId}&client_secret={_fbAuthSettings.AppSecret}&grant_type=client_credentials"); var appAccessToken = JsonConvert.DeserializeObject <FacebookAppAccessToken>(appAccessTokenResponse); // 2. validate the user access token var userAccessTokenValidationResponse = await Client.GetStringAsync($"https://graph.facebook.com/debug_token?input_token={dto.AccessToken}&access_token={appAccessToken.AccessToken}"); var userAccessTokenValidation = JsonConvert.DeserializeObject <FacebookUserAccessTokenValidation>(userAccessTokenValidationResponse); if (!userAccessTokenValidation.Data.IsValid) { return(BadRequest(Errors.AddErrorToModelState("login_failure", "Invalid facebook token.", ModelState))); } // 3. we've got a valid token so we can request user data from fb var userInfoResponse = await Client.GetStringAsync($"https://graph.facebook.com/v2.8/me?fields=id,email,first_name,last_name,name,gender,locale,birthday,picture&access_token={dto.AccessToken}"); var userInfo = JsonConvert.DeserializeObject <FacebookUserData>(userInfoResponse); // 4. ready to create the local user account (if necessary) and jwt var user = await _userService.FindByEmailAsync(userInfo.Email); if (user == null) { var appUser = new ApplicationUser { FirstName = userInfo.FirstName, LastName = userInfo.LastName, FacebookId = userInfo.Id, Email = userInfo.Email, UserName = userInfo.Email, PictureUrl = userInfo.Picture.Data.Url }; var result = await _userService.CreateUserAsync(appUser, Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8)); if (!result.Succeeded) { return(new BadRequestObjectResult(Errors.AddErrorsToModelState(result, ModelState))); } await _commadBus.Send(new CreateBusinessUserCommand(Guid.NewGuid(), new IdentityId(appUser.Id), null, userInfo.Locale, userInfo.Gender, new Email(appUser.Email), appUser.FirstName, null, appUser.LastName)); } // generate the jwt for the local user... var localUser = await _userService.FindByNameAsync(userInfo.Email); if (localUser == null) { return(BadRequest(Errors.AddErrorToModelState("login_failure", "Failed to create local user account.", ModelState))); } var jwt = await Tokens.GenerateJwt(_jwtFactory.GenerateClaimsIdentity(localUser.UserName, localUser.Id), _jwtFactory, localUser.UserName, _jwtOptions, new JsonSerializerSettings { Formatting = Formatting.Indented }); return(new OkObjectResult(jwt)); }
public async Task <IActionResult> FacebookAsync([FromBody] FacebookAuthDto model) { var appAccessTokenResponse = await Client.GetStringAsync($"https://graph.facebook.com/oauth/access_token?client_id={_fbAuthSettings.AppId}&client_secret={_fbAuthSettings.AppSecret}&grant_type=client_credentials"); var appAccessToken = JsonConvert.DeserializeObject <FacebookAppAccessToken>(appAccessTokenResponse); var userAccessTokenValidationResponse = await Client.GetStringAsync($"https://graph.facebook.com/debug_token?input_token={model.AccessToken}&access_token={appAccessToken.AccessToken}"); var userAccessTokenValidation = JsonConvert.DeserializeObject <FacebookUserAccessTokenValidation>(userAccessTokenValidationResponse); // 3. we've got a valid token so we can request user data from fb var userInfoResponse = await Client.GetStringAsync($"https://graph.facebook.com/v2.8/me?fields=id,email,first_name,last_name,name,gender,locale,birthday,picture&access_token={model.AccessToken}"); var userInfo = JsonConvert.DeserializeObject <FacebookUserData>(userInfoResponse); var user = await _userManager.FindByEmailAsync(userInfo.Email); if (user == null) { var userToCreate = new User { FacebookId = userInfo.Id, Email = userInfo.Email, UserName = userInfo.Email }; var roll = await _userManager.CreateAsync(userToCreate, Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8)); var userToReturn = _mapper.Map <UserForDetailedDto>(userToCreate); if (roll.Succeeded) { return(CreatedAtRoute("GetUser", new { controller = "Users", id = userToCreate.Id }, userToReturn)); } return(BadRequest(roll.Errors)); } var localUser = await _userManager.FindByNameAsync(userInfo.Email); return(Ok(new { token = GenerateJwtToken(localUser).Result })); }
public async Task <IActionResult> FacebookAuthentication([FromBody] FacebookAuthDto model) { // Validate model if (!ModelState.IsValid) { return(BadRequest(new RequestMessageResponse() { Success = false, Message = "Bad request." })); } // Generate an app access token var appAccessTokenResponse = await Client.GetStringAsync($"https://graph.facebook.com/oauth/access_token?client_id={_fbAuthSettings.AppId}&client_secret={_fbAuthSettings.AppSecret}&grant_type=client_credentials"); var appAccessToken = JsonConvert.DeserializeObject <FacebookAppAccessToken>(appAccessTokenResponse); // Validate the user access token var userAccessTokenValidationResponse = await Client.GetStringAsync($"https://graph.facebook.com/debug_token?input_token={model.AccessToken}&access_token={appAccessToken.AccessToken}"); var userAccessTokenValidation = JsonConvert.DeserializeObject <FacebookUserAccessTokenValidation>(userAccessTokenValidationResponse); // Invalid user token if (!userAccessTokenValidation.Data.IsValid) { return(BadRequest(new RequestMessageResponse() { Success = false, Message = "Invalid facebook token" })); } // Request data from Facebook var userInfoResponse = await Client.GetStringAsync($"https://graph.facebook.com/v2.8/me?fields=id,email,first_name,last_name,name,gender,locale,birthday,picture.type(large)&access_token={model.AccessToken}"); var userInfo = JsonConvert.DeserializeObject <FacebookUserData>(userInfoResponse); // Search for user var user = await _userManager.FindByEmailAsync(userInfo.Email); // User don't exist #region Register if (user == null) { // Create user model var appUser = new ApplicationUser { Firstname = userInfo.FirstName, Lastname = userInfo.LastName, CreatedOnUtc = DateTime.UtcNow, EmailConfirmed = true, Email = userInfo.Email, UserName = userInfo.Email, FacebookId = userInfo.Id, PictureUrl = userInfo.Picture.Data.Url }; appUser.SetGender(userInfo.Gender); // Register user var resultCreatedAccount = await _userManager.CreateAsync(appUser, Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8)); var resultCreatedRole = await _userManager.AddToRoleAsync(appUser, RoleConstants._USER); // If error, return message if (!resultCreatedAccount.Succeeded) { String errorMessage = ""; if (resultCreatedAccount.Errors.Any(c => c.Code.ToLower().Contains("duplicate"))) { errorMessage = "Email is already exists"; } else { errorMessage = resultCreatedAccount.Errors.ToString(); } return(BadRequest(new RequestMessageResponse() { Success = false, Message = errorMessage })); } // Continue to login user = appUser; // Create a storage folder for user System.IO.Directory.CreateDirectory(String.Format(FilePathConstants.PUBLIC_USERS_FILES, user.Id)); } #endregion // If facebook data is not completed bool saveNewData = false; // No Facebook Id if (user.FacebookId == null) { user.FacebookId = userInfo.Id; saveNewData = true; } // No Picture Url if (user.PictureUrl == null) { user.PictureUrl = userInfo.Picture.Data.Url; saveNewData = true; } // If data modified, save ot Db if (saveNewData) { await _userService.UpdateUser(user); } // User exists, generate token #region Login // Get identity RequestMessageResponse errorResponse = new RequestMessageResponse() { Success = false, Message = "" }; ClaimsIdentity identity = await _jwtService.GetClaimsIdentityForExternal(user, errorResponse); if (identity == null) { return(BadRequest(errorResponse)); } // Serialize and return the response var response = new { id = identity.Claims.Single(c => c.Type == "id").Value, access_token = _jwtService.GenerateEncodedToken(user.Email, identity), expires_in = _jwtService.GetValidForTotalSeconds() }; // Return result var json = JsonConvert.SerializeObject(response, _serializerSettings); return(new OkObjectResult(json)); #endregion }
public async Task <IActionResult> Facebook([FromBody] FacebookAuthDto model) { var result = await _mediator.Send(new FacebookExternalLoginRequest(model.AccessToken)); return(Ok(new ResponseViewModel(result))); }
public async Task <IActionResult> Facebook([FromBody] FacebookAuthDto model) { // 1.generate an app access token var appAccessTokenResponse = await Client.GetStringAsync($"https://graph.facebook.com/oauth/access_token?client_id={_fbAuthSettings.AppId}&client_secret={_fbAuthSettings.AppSecret}&grant_type=client_credentials"); var appAccessToken = JsonConvert.DeserializeObject <FacebookAppAccessToken>(appAccessTokenResponse); // 2. validate the user access token var userAccessTokenValidationResponse = await Client.GetStringAsync($"https://graph.facebook.com/debug_token?input_token={model.AccessToken}&access_token={appAccessToken.AccessToken}"); var userAccessTokenValidation = JsonConvert.DeserializeObject <FacebookUserAccessTokenValidation>(userAccessTokenValidationResponse); if (!userAccessTokenValidation.Data.IsValid) { return(BadRequest(Errors.AddErrorToModelState("login_failure", "Invalid facebook token.", ModelState))); } // 3. we've got a valid token so we can request user data from fb var userInfoResponse = await Client.GetStringAsync($"https://graph.facebook.com/v2.8/me?fields=id,email,first_name,last_name,name,gender,locale,birthday,picture&access_token={model.AccessToken}"); var facebookUserInfo = JsonConvert.DeserializeObject <FacebookUserData>(userInfoResponse); // 4. ready to create the local user account (if necessary) and jwt var user = await _userManager.KullaniciyiGetirEpostayaGore(facebookUserInfo.Email); string mesaj = string.Empty; if (user == null) { user = new Kullanici() { UserName = facebookUserInfo.Email, Email = facebookUserInfo.Email, EmailConfirmed = false, YaratilmaTarihi = DateTime.Now, Pasif = true, Yonetici = false, FacebookId = facebookUserInfo.Id, //FaceBookPictureUrl = userInfo.Picture.Data.Url }; user.Kisi = new KullaniciKisi { Unvan = "Doç.Dr.", Ad = facebookUserInfo.FirstName, Soyad = facebookUserInfo.LastName, CinsiyetNo = 1, DogumTarihi = new DateTime(1970, 11, 15) }; KisiyeFacebookFotografiEkle(facebookUserInfo, user); var result = await _userManager.CreateAsync(user, Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 8)); if (!result.Succeeded) { return(Ok(Sonuc.Basarisiz(new Hata[] { new Hata { Kod = "", Tanim = "Facebook bilgileriyle kullanıcı yaratılamadı!" } }))); } else { mesaj = "Facebook kullanıcısı yaratıldı. Hesabınız onay sürecinde. Lütfen Eposta adresinizi kontrol ediniz."; } } else { bool kayitGerekli = false; if (user.FacebookId == null || user.FacebookId != facebookUserInfo.Id) { //user.Pasif = true; //user.EmailConfirmed = false; if (facebookUserInfo.Gender == "male") { user.Kisi.CinsiyetNo = 1; } else if (facebookUserInfo.Gender == "female") { user.Kisi.CinsiyetNo = 2; } kayitGerekli = true; } var facebookFotograflari = user.Kisi.Fotograflari.Where(f => f.DisKaynakId == "facebook").ToList(); var facebookFotografiYok = facebookFotograflari != null && !facebookFotograflari.Any(fb => fb.Url == facebookUserInfo.Picture.Data.Url); var suankiProfilFotografi = user.Kisi.Fotograflari.SingleOrDefault(f => f.ProfilFotografi); if (suankiProfilFotografi != null) { suankiProfilFotografi.ProfilFotografi = false; kayitGerekli = true; } if (facebookFotografiYok) { KisiyeFacebookFotografiEkle(facebookUserInfo, user); kayitGerekli = true; } if (kayitGerekli) { var degistirmeSonuc = await _userManager.UpdateAsync(user); if (!degistirmeSonuc.Succeeded) { return(Ok(Sonuc.Basarisiz(new Hata[] { new Hata { Kod = "", Tanim = "Facebook bilgileriyle kullanıcı kaydedilemedi!" } }))); } else { mesaj = "Facebook bilgileriyle kullanıcı var olan kullanıcı ilişkilendirildi. Hesabınızı onaylanması gerekli. Lütfen eposta adresinizi kontrol ediniz."; } } } // generate the jwt for the local user... var localUser = await _userManager.KullaniciyiGetirEpostayaGore(facebookUserInfo.Email); if (localUser == null) { return(Ok(Sonuc.Basarisiz(new Hata[] { new Hata { Kod = "Giris Başarısız", Tanim = "Facebook bilgileriyle lokal kullanıcı hesabı yaratılamadı!" } }))); } var girisYapabilirSonuc = await signInManager.CanSignInAsync(localUser); if (girisYapabilirSonuc) { if (!localUser.EmailConfirmed) { //Eposta konfirme etme süreci başlasın } } if (!localUser.Pasif) { //Aktifleştirme süreci başlasın } var jwt = await Tokens.GenerateJwt(_jwtFactory.GenerateClaimsIdentity(localUser), _jwtFactory, localUser.UserName, _jwtOptions); var kullaniciDto = user.ToKullaniciBilgi(); var sonuc = KayitSonuc <object> .IslemTamam(new { tokenString = jwt, kullanici = kullaniciDto }); sonuc.Mesajlar[0] = $"Hoşgeldiniz {kullaniciDto.TamAdi}!"; sonuc.Mesajlar.Add(mesaj); return(Ok(sonuc)); }