-
Notifications
You must be signed in to change notification settings - Fork 0
/
models.go
55 lines (47 loc) · 1.22 KB
/
models.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
package passwordless
import (
"crypto/rand"
"crypto/subtle"
"encoding/base64"
"github.com/guregu/null"
"io"
"net/url"
"time"
)
const (
TokenLength int = 32
TtlDuration time.Duration = 20 * time.Minute
)
type User struct {
Id int64 `db:"id"`
Email string `db:"email"`
Token string `db:"token"`
Ttl time.Time `db:"ttl"`
OriginUrl null.String `db:"originurl"`
}
// RefreshToken refreshes Ttl and Token for the User.
func (u *User) RefreshToken() error {
token := make([]byte, TokenLength)
if _, err := io.ReadFull(rand.Reader, token); err != nil {
return err
}
u.Token = base64.URLEncoding.EncodeToString(token)
u.Ttl = time.Now().UTC().Add(TtlDuration)
return nil
}
// IsValidToken returns a bool indicating that the User's current token hasn't
// expired and that the provided token is valid.
func (u *User) IsValidToken(token string) bool {
if u.Ttl.Before(time.Now().UTC()) {
return false
}
return subtle.ConstantTimeCompare([]byte(u.Token), []byte(token)) == 1
}
func (u *User) UpdateOriginUrl(originUrl *url.URL) error {
var nsOrigin null.String
if err := nsOrigin.Scan(originUrl.String()); err != nil {
return err
}
u.OriginUrl = nsOrigin
return nil
}