You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

84 lines
1.9 KiB

package usersrv
import (
"errors"
"time"
"github.com/arnaucube/gogame/database"
"github.com/arnaucube/gogame/models"
jwt "github.com/dgrijalva/jwt-go"
"golang.org/x/crypto/bcrypt"
"gopkg.in/mgo.v2/bson"
)
type Service struct {
db *database.Db
}
func New(db *database.Db) *Service {
return &Service{
db,
}
}
func hashPassword(password string) (string, error) {
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.MinCost)
return string(hash), err
}
func checkPasswordHash(password, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}
func (srv Service) Register(name, password, email string) (*models.User, error) {
var user models.User
err := srv.db.Users.Find(bson.M{"email": email}).One(&user)
if err == nil {
return nil, errors.New("user already exist")
}
hashedPassword, err := hashPassword(password)
if err != nil {
return nil, err
}
newUser := models.User{
Name: name,
Password: hashedPassword,
Email: email,
}
err = srv.db.Users.Insert(newUser)
if err != nil {
return nil, err
}
err = srv.db.Users.Find(bson.M{"email": email}).One(&user)
user.Password = ""
return &user, err
}
var signingKey = []byte("TODO") // TODO
func (srv Service) Login(email, password string) (*string, *models.User, error) {
var user models.User
err := srv.db.Users.Find(bson.M{"email": email}).One(&user)
if err != nil {
return nil, nil, errors.New("user not exist")
}
if !checkPasswordHash(password, user.Password) {
return nil, nil, errors.New("error with password")
}
user.Password = ""
// create jwt
token := jwt.New(jwt.SigningMethodHS256)
claims := make(jwt.MapClaims)
claims["user"] = true
claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
token.Claims = claims
tokenString, err := token.SignedString(signingKey)
if err != nil {
return nil, nil, errors.New("error creating token")
}
return &tokenString, &user, err
}