/
session.go
79 lines (58 loc) · 1.68 KB
/
session.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
package hivehome
import (
"bytes"
"encoding/json"
"net/url"
"time"
"github.com/dgrijalva/jwt-go"
"github.com/pkg/errors"
)
type loginResponse struct {
Sessions []*sessionResponse `json:"sessions"`
}
type sessionResponse struct {
SessionID string `json:"sessionId"`
}
func (c *Client) checkSession() error {
if _, ok := c.commonHeaders["X-Omnia-Access-Token"]; !ok {
return c.getToken()
}
t := c.commonHeaders["X-Omnia-Access-Token"][0]
token, _, err := new(jwt.Parser).ParseUnverified(t, jwt.MapClaims{})
if err != nil {
return errors.Wrap(err, "Error parsing JWT")
}
claims, ok := token.Claims.(jwt.MapClaims)
if !ok {
return errors.Wrap(err, "Error mapping token claims")
}
var tm time.Time
expires := int64(claims["exp"].(float64))
tm = time.Unix(expires, 0)
timeRemaining := tm.Sub(time.Now())
if timeRemaining.Minutes() < 5 {
return c.getToken()
}
return nil
}
func (c *Client) getToken() error {
b := new(bytes.Buffer)
path := &url.URL{Path: "/omnia/auth/sessions"}
url := c.BaseURL.ResolveReference(path)
delete(c.commonHeaders, "X-Omnia-Access-Token")
json.NewEncoder(b).Encode(c.sessionInfo)
status, _, rbody, err := c.httpClient.Do("POST", url.String(), c.commonHeaders, b)
if err != nil {
return errors.Wrap(err, "Error calling Hivehome session API")
}
if status.Code != 200 {
return errors.Wrap(errors.New("Non-200 response received when creating new Hivehome session"), status.String())
}
lr := new(loginResponse)
err = json.NewDecoder(rbody).Decode(lr)
if err != nil {
return errors.Wrap(err, "Error when decoding new Session response body")
}
c.commonHeaders["X-Omnia-Access-Token"] = []string{lr.Sessions[0].SessionID}
return nil
}