반응형
◆ 패스워드 해싱
▶ 해싱을 위한 패키지 설치
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)
}
반응형
'IT 초보코딩의 세계 > Go 언어' 카테고리의 다른 글
Go 언어 Back End 제작해보기(신용카드 결제 처리) 7장 (10) | 2023.06.06 |
---|---|
Go 언어 Back End 제작해보기(데이터베이스) 5장 (1) | 2023.05.25 |
Go 언어 Back End 제작해보기(보안) 4장 (8) | 2023.05.24 |
Go 언어 Back End 제작해보기(미들웨어) 3장 (4) | 2023.05.23 |
Go 언어 Back End 제작해보기(라우팅 설정) 2장 (10) | 2023.05.22 |
댓글