Example #1
0
        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
            }));
        }
Example #3
0
        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));
        }