Skip to content

Commit 01b3812

Browse files
author
greensheng
committed
change password
1 parent ffc6a96 commit 01b3812

File tree

6 files changed

+73
-11
lines changed

6 files changed

+73
-11
lines changed

models/mysql/user_store.go

+5
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,8 @@ func (s *Store) AddUser(user *models.User) error {
3333
user.CreatedAt = time.Now()
3434
return s.db.Create(user).Error
3535
}
36+
37+
func (s *Store) UpdateUser(user *models.User) error {
38+
return s.db.Save(user).Error
39+
40+
}

models/store.go

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type Store interface {
2323

2424
GetUserByEmail(email string) (*User, error)
2525
AddUser(user *User) error
26+
UpdateUser(user *User) error
2627

2728
GetAccount(userId int64, currency string) (*Account, error)
2829
GetAccountsByUserId(userId int64) ([]*Account, error)

rest/server.go

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func (server *HttpServer) Start() {
5151
private.DELETE("/api/orders", CancelOrders)
5252
private.GET("/api/accounts", GetAccounts)
5353
private.GET("/api/users/self", GetUsersSelf)
54+
private.GET("/api/users/password", ChangePassword)
5455
private.DELETE("/api/users/accessToken", SignOut)
5556
private.GET("/api/wallets/:currency/address", GetWalletAddress)
5657
private.GET("/api/wallets/:currency/transactions", GetWalletTransactions)

rest/user_controller.go

+27-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func SignUp(ctx *gin.Context) {
3030
return
3131
}
3232

33-
_, err = service.SignUp(request.Email, request.Password)
33+
_, err = service.CreateUser(request.Email, request.Password)
3434
if err != nil {
3535
ctx.JSON(http.StatusBadRequest, newMessageVo(err))
3636
return
@@ -57,6 +57,32 @@ func SignIn(ctx *gin.Context) {
5757
ctx.JSON(http.StatusOK, token)
5858
}
5959

60+
// POST /users/password
61+
func ChangePassword(ctx *gin.Context) {
62+
var req changePasswordRequest
63+
err := ctx.BindJSON(&req)
64+
if err != nil {
65+
ctx.JSON(http.StatusBadRequest, newMessageVo(err))
66+
return
67+
}
68+
69+
// check old password
70+
_, err = service.GetUserByPassword(GetCurrentUser(ctx).Email, req.OldPassword)
71+
if err != nil {
72+
ctx.JSON(http.StatusBadRequest, newMessageVo(err))
73+
return
74+
}
75+
76+
// change password
77+
err = service.ChangePassword(GetCurrentUser(ctx).Email, req.NewPassword)
78+
if err != nil {
79+
ctx.JSON(http.StatusInternalServerError, newMessageVo(err))
80+
return
81+
}
82+
83+
ctx.JSON(http.StatusOK, nil)
84+
}
85+
6086
// DELETE /users/accessToken
6187
func SignOut(ctx *gin.Context) {
6288
ctx.SetCookie("accessToken", "", -1, "/", "*", false, false)

rest/vo.go

+5
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ type SignUpRequest struct {
103103
Password string
104104
}
105105

106+
type changePasswordRequest struct {
107+
OldPassword string
108+
NewPassword string
109+
}
110+
106111
type userVo struct {
107112
Id string `json:"id"`
108113
Email string `json:"email"`

service/user_service.go

+34-10
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func init() {
3535
gbeConfig = cfg
3636
}
3737

38-
func SignUp(email, password string) (*models.User, error) {
38+
func CreateUser(email, password string) (*models.User, error) {
3939
user, err := GetUserByEmail(email)
4040
if err != nil {
4141
return nil, err
@@ -48,11 +48,7 @@ func SignUp(email, password string) (*models.User, error) {
4848
Email: email,
4949
PasswordHash: encryptPassword(password),
5050
}
51-
err = mysql.SharedStore().AddUser(user)
52-
if err != nil {
53-
return nil, err
54-
}
55-
return user, nil
51+
return user, mysql.SharedStore().AddUser(user)
5652
}
5753

5854
func RefreshAccessToken(email, password string) (string, error) {
@@ -68,9 +64,10 @@ func RefreshAccessToken(email, password string) (string, error) {
6864
}
6965

7066
claim := jwt.MapClaims{
71-
"id": user.Id,
72-
"email": user.Email,
73-
"expiredAt": time.Now().Unix(),
67+
"id": user.Id,
68+
"email": user.Email,
69+
"passwordHash": user.PasswordHash,
70+
"expiredAt": time.Now().Unix(),
7471
}
7572
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim)
7673
return token.SignedString([]byte(gbeConfig.JwtSecret))
@@ -92,21 +89,48 @@ func CheckToken(tokenStr string) (*models.User, error) {
9289
}
9390

9491
email := claim["email"].(string)
92+
passwordHash := claim["passwordHash"].(string)
9593

9694
user, err := GetUserByEmail(email)
9795
if err != nil {
9896
return nil, err
9997
}
10098
if user == nil {
101-
return nil, errors.New("bad token")
99+
return nil, errors.New("bad token: 0x1")
100+
}
101+
if user.PasswordHash != passwordHash {
102+
return nil, errors.New("bad token: 0x2")
102103
}
103104
return user, nil
104105
}
105106

107+
func ChangePassword(email, newPassword string) error {
108+
user, err := GetUserByEmail(email)
109+
if err != nil {
110+
return err
111+
}
112+
if user == nil {
113+
return errors.New("user not found")
114+
}
115+
user.PasswordHash = encryptPassword(newPassword)
116+
return mysql.SharedStore().UpdateUser(user)
117+
}
118+
106119
func GetUserByEmail(email string) (*models.User, error) {
107120
return mysql.SharedStore().GetUserByEmail(email)
108121
}
109122

123+
func GetUserByPassword(email, password string) (*models.User, error) {
124+
user, err := GetUserByEmail(email)
125+
if err != nil {
126+
return nil, err
127+
}
128+
if user == nil || user.PasswordHash != encryptPassword(password) {
129+
return nil, errors.New("user not found or password incorrect")
130+
}
131+
return user, nil
132+
}
133+
110134
func encryptPassword(password string) string {
111135
hash := md5.New().Sum([]byte(password))
112136
return fmt.Sprintf("%x", hash)

0 commit comments

Comments
 (0)