mirror of
https://github.com/arnaucube/gogame.git
synced 2026-02-07 03:26:39 +01:00
minimal register&login working
This commit is contained in:
@@ -1,5 +1,87 @@
|
||||
package usersrv
|
||||
|
||||
func New() {
|
||||
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) (*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 not exist")
|
||||
}
|
||||
if !checkPasswordHash(password, user.Password) {
|
||||
return nil, errors.New("error with 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, errors.New("error creating token")
|
||||
}
|
||||
|
||||
// TODO
|
||||
// reuse Password parameter, to put there the token
|
||||
user.Password = tokenString
|
||||
|
||||
return &user, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user