MERN을 이용한 ECOMMERCE 웹사이트 Part-6.2 ( 인증 { 비밀번호 보안 } )

이 블로그에서는 사용자 세부 정보, 특히 비밀번호를 보호합니다.





여기에서 사용자를 등록할 때 원하지 않는 사용자password를 볼 수 있고 데이터베이스에 저장encrypt하기 전에 비밀번호user details를 입력해야 합니다.
password는 데이터베이스에서 암호화되지 않습니다.

따라서 비밀번호를 암호화하기 위해 다음을 수행합니다.



1단계 bcryptjs 파일에서 userModel.js 가져오기


2 단계 우리는 우리의 pre save event를 내보내기 전에 userSchemauserModel를 만듭니다.



3단계 이 이벤트는 함수를 사용하며 여기서는 async function() 키워드를 사용할 수 없도록 this 키워드를 제공했습니다.

이제 다음 코드를 작성하여 비밀번호를 암호화해 보겠습니다.


여기서 우리는 arrow function 두 개의 인수를 사용했습니다. 첫 번째는 해시에 필요한 것이고 두 번째는 힘입니다. 파워 값이 클수록 암호를 해킹하기가 더 어려워집니다. 권장 값이므로 10을 사용하고 있습니다.

그러나 사용자를 업데이트해야 하는 경우에는 이미 있는bcrypt.hash() 암호를 원하지 않습니다hash. 따라서 암호화하기 전에 다음 논리를 사용하는 것을 방지하기 위해.


여기서 우리는 암호hashed가 있는지 확인하고 그렇지 않은 경우is modified를 반환하고 이미 수정된 경우 다시 수정하지 않습니다next().

결정적인
따라서 이 블로그의 최종password 파일은

const mongoose = require("mongoose");
const validator = require("validator");
const bcrypt = require("bcryptjs");

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: [true, "Please Enter Your Name"],
    maxLength: [30, "Name cannot exceed 30 characters"],
    minLength: [4, "Name should have more than 4 characters"],
  },
  email: {
    type: String,
    required: [true, "Please Enter Your Email"],
    unique: true,
    validate: [validator.isEmail, "Please Enter a valid Email"],
  },
  password: {
    type: String,
    required: [true, "Please Enter Your Password"],
    minLength: [8, "Password should be greater than 8 characters"],
    select: false,
  },
  avatar: {
    public_id: {
      type: String,
      required: true,
    },
    url: {
      type: String,
      required: true,
    },
  },
  role: {
    type: String,
    default: "user",
  },
  createdAt: {
    type: Date,
    default: Date.now,
  },

  resetPasswordToken: String,
  resetPasswordExpire: Date,
});

userSchema.pre("save", async function (next) {
  if (!this.isModified("password")) {
    next();
  }

  this.password = await bcrypt.hash(this.password, 10);
});

module.exports = mongoose.model("User", userSchema);




테스트

이제 비밀번호를 볼 수 있는지 봅시다.


여기에서 새 사용자를 등록했으며 이에 대한 응답으로 로그인에 필요한 사용자 세부 정보를 받고 있습니다. 그러나 userModel.js 필드를 자세히 살펴보십시오. 그것의 해시. 이제 아무도 이 해시 코드를 보고 암호가 무엇인지 알 수 없습니다.

참고 지난 블로그에서 한 사람은 사용자가 제공한 비밀번호를 반환한다고 말했습니다. 그러나 password 필드로 해결된 우리는 사용자가 password 우리가 사용한 암호see를 원할 때까지 표시되지 않습니다.


등록하는 동안 자동 로그인을 원하므로 비밀번호를 반환해야 합니다(이는 다음 블로그에서 구현됩니다).

참고로 저도 이 프로젝트를 하면서 동시에 글을 쓰고 있기 때문에 분명히 실수가 있을 수 있습니다. 따라서 한 부분에서 실수가 발생하면 반드시 수정하고 다음 부분에서 해당 실수를 지적합니다.

그러니 꾸짖지 마세요 <3.

좋은 웹페이지 즐겨찾기