본문 바로가기
IT 초보코딩의 세계/Go 언어

Go 언어 Back End 제작해보기(패스워드 해싱) 6장

by 조이럭키7 2023. 5. 26.
반응형

패스워드 해싱

해싱을 위한 패키지 설치

go get golang.org/x/crypto/bcrypt

dblayer 디렉토리의 dblayer.go 파일에 추가

var ErrINVALIDPASSWORD = errors.New("Invalid password")

dblayer 디렉토리의 orm.go 파일에 패키지 import

import (
  "errors"
  "models"
  _ "github.com/go-sql-driver/mysql"
  "github.com/jinzhu/gorm"
  "golang.org/x/crypto/bcrypt"
)

dblayer 디렉토리의 orm.go 파일에 함수 추가

func hashPassword(s *string) error {
  if s == nil {
  return errors.New("Reference provided for hashing password is nil")
  }
  //converd password string to byte slice
  sBytes := []byte(*s)
  //Obtain hashed password
  hashedBytes, err := bcrypt.GenerateFromPassword(sBytes, bcrypt.DefaultCost)
  if err != nil {
  return err
  }
  //update password string with the hashed version
  *s = string(hashedBytes[:])
  return nil
}

dblayer 디렉토리의 orm.go 파일에 AddUser 함수 수정

func (db *DBORM) AddUser(customer models.Customer) (models.Customer, error) {
  hashPassword(&customer.Pass)
  customer.LoggedIn = true
  err := db.Create(&customer).Error
  customer.Pass = ""
  return customer, err
}

dblayer 디렉토리의 orm.go 파일에 함수 추가

func checkPassword(existingHash, incomingPass string) bool {
  return bcrypt.CompareHashAndPassword([]byte(existingHash), []byte(incomingPass)) == nil
}

dblayer 디렉토리의 orm.go 파일에 SignIn 함수 수정

func (db *DBORM) SignInUser(email, pass string) (customer models.Customer, err error) {
  result := db.Table("Customers").Where(&models.Customer{Email: email})
  err = result.First(&customer).Error
  if err != nil {
  return customer, err
  }

  if !checkPassword(customer.Pass, pass) {
  return customer, ErrINVALIDPASSWORD
  }

  customer.Pass = ""
  err = result.Update("loggedin", 1).Error
  if err != nil {
  return customer, err
  }
  //사용자 행 반환
  return customer, result.Find(&customer).Error
}

rest 디렉토리의 handler.go 파일의 SignIn 함수 수정

func (h *Handler) SignIn(c *gin.Context) {
  if h.db == nil {
  return
  }
  var customer models.Customer
  err := c.ShouldBindJSON(&customer)
  if err != nil {
  c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  return
  }
  customer, err = h.db.SignInUser(customer.Email, customer.Pass)
  if err != nil {
  if err == dblayer.ErrINVALIDPASSWORD {
  c.JSON(http.StatusForbidden, gin.H{"error": err.Error()})
  return
  }
  c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
  return
  }
  c.JSON(http.StatusOK, customer)
}
반응형

댓글