arnaucube
arnaucube/gogame-oldPublic Self-hosted repository
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) (*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, nil, errors.New("user not exist")
65	}
66	if !checkPasswordHash(password, user.Password) {
67		return nil, nil, errors.New("error with password")
68	}
69	user.Password = ""
70
71	// create jwt
72	token := jwt.New(jwt.SigningMethodHS256)
73	claims := make(jwt.MapClaims)
74	claims["user"] = true
75	claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
76	token.Claims = claims
77
78	tokenString, err := token.SignedString(signingKey)
79	if err != nil {
80		return nil, nil, errors.New("error creating token")
81	}
82
83	return &tokenString, &user, err
84}