/
user.go
80 lines (66 loc) · 1.81 KB
/
user.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package controllers
import (
"time"
"aahframework.org/aah.v0"
"aahframework.org/essentials.v0"
"github.com/dgrijalva/jwt-go"
"github.com/train-cat/api-train/app/models"
"github.com/train-cat/api-train/app/repositories"
"github.com/train-cat/api-train/app/security"
"golang.org/x/crypto/bcrypt"
)
// UserController regroup all endpoints concern the user
type UserController struct {
Controller
}
// Post create new user
func (c *UserController) Post(i *models.UserInput) {
if !c.validatePost(i) {
return
}
u, err := repositories.User.Persist(i)
if c.serverError(err) || c.serverError(c.hateoas(u)) {
return
}
c.Reply().Created().JSON(u)
}
// Token authenticate one user
func (c *UserController) Token(t *models.UserToken) {
// NOTE: Validation feature is upcoming :)
if ess.IsStrEmpty(t.Username) || ess.IsStrEmpty(t.Password) {
c.Reply().BadRequest().JSON(aah.Data{
"message": "bad request",
})
return
}
// get the user details by username
user, err := repositories.User.FindByUsername(t.Username)
if user == nil || err != nil {
c.Reply().Unauthorized().JSON(aah.Data{
"message": "invalid credentials",
})
return
}
// validate password
if err := bcrypt.CompareHashAndPassword([]byte(user.EncodedPassword), []byte(t.Password)); err != nil {
c.Reply().Unauthorized().JSON(aah.Data{
"message": "invalid credentials",
})
return
}
// Generate JWT token
token := security.CreateJWTToken()
// Set claims
claims := token.Claims.(jwt.MapClaims)
claims["username"] = *user.Username
claims["exp"] = time.Now().Add(time.Hour * 72).Unix()
// Generate encoded token and send it as response.
signedToken, err := token.SignedString(security.JWTSigningKey)
if c.serverError(err) {
return
}
// everything went good, respond token
c.Reply().Ok().JSON(aah.Data{
"token": signedToken,
})
}