gogame-old/services/usersrv/usersrv.go
services/usersrv/usersrv.goRaw
1package usersrv
2
3import (
4 "errors"
5 "time"
6
7 "github.com/arnaucube/gogame/database"
8 "github.com/arnaucube/gogame/models"
9 jwt "github.com/dgrijalva/jwt-go"
10 "golang.org/x/crypto/bcrypt"
11 "gopkg.in/mgo.v2/bson"
12)
13
14type Service struct {
15 db *database.Db
16}
17
18func New(db *database.Db) *Service {
19 return &Service{
20 db,
21 }
22}
23
24func hashPassword(password string) (string, error) {
25 hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.MinCost)
26 return string(hash), err
27}
28func checkPasswordHash(password, hash string) bool {
29 err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
30 return err == nil
31}
32
33func (srv Service) Register(name, password, email string) (*models.User, error) {
34 var user models.User
35 err := srv.db.Users.Find(bson.M{"email": email}).One(&user)
36 if err == nil {
37 return nil, errors.New("user already exist")
38 }
39
40 hashedPassword, err := hashPassword(password)
41 if err != nil {
42 return nil, err
43 }
44 newUser := models.User{
45 Name: name,
46 Password: hashedPassword,
47 Email: email,
48 }
49 err = srv.db.Users.Insert(newUser)
50 if err != nil {
51 return nil, err
52 }
53 err = srv.db.Users.Find(bson.M{"email": email}).One(&user)
54 user.Password = ""
55 return &user, err
56}
57
58var signingKey = []byte("TODO") // TODO
59
60func (srv Service) Login(email, password string) (*models.User, error) {
61 var user models.User
62 err := srv.db.Users.Find(bson.M{"email": email}).One(&user)
63 if err != nil {
64 return nil, errors.New("user not exist")
65 }
66 if !checkPasswordHash(password, user.Password) {
67 return nil, errors.New("error with password")
68 }
69
70 // create jwt
71 token := jwt.New(jwt.SigningMethodHS256)
72 claims := make(jwt.MapClaims)
73 claims["user"] = true
74 claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
75 token.Claims = claims
76
77 tokenString, err := token.SignedString(signingKey)
78 if err != nil {
79 return nil, errors.New("error creating token")
80 }
81
82 // TODO
83 // reuse Password parameter, to put there the token
84 user.Password = tokenString
85
86 return &user, err
87}