-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsesiones.go
128 lines (103 loc) · 3.06 KB
/
sesiones.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package sesiones
import (
"fmt"
"net/http"
"time"
jwt "github.com/dgrijalva/jwt-go"
"github.com/pkg/errors"
)
// chequearToken determina si el token ingresado es válido, si es así le
// actualiza la hora de vencimiento.
func (h *Handler) chequearToken(token string) (tokenOut *jwt.Token, err error) {
t1, err := h.parseToken(token)
if err != nil {
return tokenOut, errors.Wrap(err, "chequeando token")
}
// Infiero tipo
claims := t1.Claims.(jwt.MapClaims)
t2, err := h.newToken(claims["userID"].(string))
if err != nil {
return tokenOut, errors.Wrap(err, "creando nuevo token")
}
return t2, nil
}
// setToken pega la cookie a la response.
func (h *Handler) setToken(w http.ResponseWriter, token *jwt.Token) (err error) {
cookie := http.Cookie{}
//cookie.HttpOnly = true
cookie.Name = "token"
cookie.Path = "/"
cookie.Value, err = token.SignedString(h.secretKey)
if err != nil {
return errors.Wrap(err, "firmando token")
}
cookie.Expires = time.Now().Add(h.DuracionSesion)
http.SetCookie(w, &cookie)
return
}
// setTokenVencido pega una cookie vencida a la response.
func (h *Handler) setTokenVencido(w http.ResponseWriter, token *jwt.Token) (err error) {
cookie := http.Cookie{}
//cookie.HttpOnly = true
cookie.Name = "token"
cookie.Path = "/"
cookie.Value, err = token.SignedString(h.secretKey)
if err != nil {
return errors.Wrap(err, "firmando token")
}
cookie.MaxAge = -1
http.SetCookie(w, &cookie)
return
}
// parseToken transforma el string en un jwt.Token
func (h *Handler) parseToken(tokenString string) (token *jwt.Token, err error) {
token, err = jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
}
return h.secretKey, nil
})
if err != nil {
return token, errors.Wrap(err, "parseando JWT")
}
// Corroboro
_, ok := token.Claims.(jwt.MapClaims)
if !ok || !token.Valid {
return token, errors.New("token inválido")
}
return
}
// NewToken Handlers
func (h *Handler) newToken(userID string) (token *jwt.Token, err error) {
// Create the token
token = jwt.New(jwt.SigningMethodHS256)
// Create a map to store our claims
claims := token.Claims.(jwt.MapClaims)
// Set token claims
claims["userID"] = userID
claims["exp"] = time.Now().Add(h.DuracionSesion).Unix()
return
}
// usuarioID devuelve el campo Nombre para el usuario de la sesión
func (h *Handler) usuarioID(r *http.Request) (id string, err error) {
tokenString, err := extraerToken(r)
if err != nil {
return id, errors.Wrap(err, "extrayendo token de request")
}
token, err := h.parseToken(tokenString)
if err != nil {
return id, errors.Wrap(err, "parseando token")
}
// Infiero tipo
claims := token.Claims.(jwt.MapClaims)
id = claims["userID"].(string)
return id, err
}
// devuelve el token que está en la request
func extraerToken(r *http.Request) (token string, err error) {
c, err := r.Cookie("token")
if err != nil {
return token, errors.Wrap(err, "buscando cookie")
}
return c.Value, nil
}