/// <summary> /// Tạo người dùng lưu vào Database /// <param name="registerDetails">Model đăng kí tài khoản mới</param> /// <returns></returns> private ACCOUNT CreateUser(RegisterViewModel registerDetails) { var passwordSalt = CreateSalt(); var user = new ACCOUNT { NAME = registerDetails.Username, SALT = passwordSalt, EMAIL = registerDetails.Email, PASSWORDHASH = EncryptPassword(registerDetails.Password, passwordSalt), IMAGEACC = imgnormal }; DbContextTransaction dt = db.Database.BeginTransaction(); try { db.ACCOUNTs.Add(user); db.SaveChanges(); ACCOUNT_ROLE role = new ACCOUNT_ROLE(); role.IDROLE = 2; role.IDUSER = user.ID; db.ACCOUNT_ROLE.Add(role); db.SaveChanges(); dt.Commit(); } catch (Exception ex) { dt.Rollback(); } return(user); }
/// <summary> /// Tạo token cho người dùng đăng nhập facebook, google... /// </summary> /// <param name="user">Thông tin cơ bản người dùng</param> /// <param name="dbUser">Thông báo User trong Response</param> /// <returns></returns> private static string CreateTokenLogin(ACCOUNT user, out object dbUser) { FOODEntities db = new FOODEntities(); var unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); var expiry = Math.Round((DateTime.UtcNow.AddHours(2) - unixEpoch).TotalSeconds); var issuedAt = Math.Round((DateTime.UtcNow - unixEpoch).TotalSeconds); var notBefore = Math.Round((DateTime.UtcNow.AddMonths(6) - unixEpoch).TotalSeconds); ACCOUNT_ROLE account = db.ACCOUNT_ROLE.FirstOrDefault(x => x.IDUSER == user.ID); LIST_ROLE listrole = db.LIST_ROLE.FirstOrDefault(x => x.ID == account.IDROLE); var payload = new Dictionary <string, object> { { "email", user.EMAIL }, { "userId", user.ID }, { "role", listrole.NAME }, { "sub", user.ID }, { "nbf", notBefore }, { "iat", issuedAt }, { "exp", expiry } }; //var secret = ConfigurationManager.AppSettings.Get("jwtKey"); const string apikey = "secretKey"; var token = JsonWebToken.Encode(payload, apikey, JwtHashAlgorithm.HS256); dbUser = new { user.ID, user.NAME, user.IMAGEACC }; return(token); }
public async Task <HttpResponseMessage> RegisterExternal(RegisterExternalBindingModel model) { HttpResponseMessage response; string name = ""; string birthday = ""; string gender = ""; string email = ""; string picture = ""; dynamic myInfo = ""; var token = ""; if (!ModelState.IsValid) { response = Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); } var verifiedAccessToken = await VerifyExternalAccessToken(model.Provider, model.ExternalAccessToken); if (verifiedAccessToken == null) { response = Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid Provider or External Access Token"); } EXTERNALACCOUNT user = db.EXTERNALACCOUNTs.FirstOrDefault (x => x.PROVIDERKEY == verifiedAccessToken.user_id & x.LOGINPROVIDER == model.Provider); bool hasRegistered = user != null; object dbUser; if (hasRegistered) { ACCOUNT account1 = db.ACCOUNTs.FirstOrDefault(x => x.ID == user.IDUSER); token = CreateTokenLogin(account1, out dbUser); response = Request.CreateResponse(new { dbUser, token }); return(response); } if (model.Provider == "Facebook") { var fb = new FacebookClient(model.ExternalAccessToken); myInfo = fb.Get("/me?fields=name,id,gender,birthday,email,picture"); if (myInfo["email"] != "") { email = myInfo["email"]; } if ((myInfo["name"] != "")) { name = myInfo["name"]; } try { picture = picture = String.Format("https://graph.facebook.com/{0}/picture?width=200&height=200", verifiedAccessToken.user_id); } catch (Exception ex) { } } if (model.Provider == "Google") { HttpClient client = new HttpClient(); var urlProfile = "https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + model.ExternalAccessToken; client.CancelPendingRequests(); HttpResponseMessage output = await client.GetAsync(urlProfile); if (output.IsSuccessStatusCode) { string outputData = await output.Content.ReadAsStringAsync(); GoogleUserOutputData serStatus = JsonConvert.DeserializeObject <GoogleUserOutputData>(outputData); if (serStatus != null) { if (!string.IsNullOrEmpty(serStatus.email)) { email = serStatus.email; } if (!string.IsNullOrEmpty(serStatus.name)) { name = serStatus.name; } if (!string.IsNullOrEmpty(serStatus.picture)) { picture = serStatus.picture; } } } } EXTERNALACCOUNT external = new EXTERNALACCOUNT(); ACCOUNT usermain = new ACCOUNT(); ACCOUNT acc = new ACCOUNT(); acc = db.ACCOUNTs.FirstOrDefault(x => x.EMAIL == email); if (acc != null) { external.PROVIDERKEY = verifiedAccessToken.user_id; external.IDUSER = acc.ID; external.LOGINPROVIDER = model.Provider; db.EXTERNALACCOUNTs.Add(external); db.SaveChanges(); } else { external.PROVIDERKEY = verifiedAccessToken.user_id; external.IDUSER = db.ACCOUNTs.Count() + 1; external.LOGINPROVIDER = model.Provider; if (!string.IsNullOrEmpty(email)) { usermain.EMAIL = email; } if (!string.IsNullOrEmpty(name)) { usermain.NAME = name; } usermain.ID = external.IDUSER; ACCOUNT_ROLE role = new ACCOUNT_ROLE(); role.IDUSER = external.IDUSER; role.IDROLE = 2; if (!string.IsNullOrEmpty(picture)) { Account account = new Account("dqabuxewl", "198449299438919", "SRASj3YoFcfLsetrHFNNwGVF4qQ"); CloudinaryDotNet.Cloudinary cloudinary = new CloudinaryDotNet.Cloudinary(account); var uploadParams = new ImageUploadParams() { File = new FileDescription(picture) }; var uploadResult = cloudinary.Upload(uploadParams); usermain.IMAGEACC = uploadResult.Uri.OriginalString; } else { usermain.IMAGEACC = imgnormal; } DbContextTransaction dt = db.Database.BeginTransaction(); try { db.EXTERNALACCOUNTs.Add(external); db.SaveChanges(); db.ACCOUNTs.Add(usermain); db.SaveChanges(); db.ACCOUNT_ROLE.Add(role); db.SaveChanges(); dt.Commit(); } catch (Exception ex) { dt.Rollback(); return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Error")); } } //Create token usermain = new ACCOUNT(); usermain = db.ACCOUNTs.FirstOrDefault(x => x.EMAIL == email); token = CreateTokenLogin(usermain, out dbUser); response = Request.CreateResponse(new { dbUser, token }); return(response); }