-
Notifications
You must be signed in to change notification settings - Fork 0
/
auth.go
61 lines (54 loc) · 1.53 KB
/
auth.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
package jwt_auth
import (
"github.com/dgrijalva/jwt-go"
"time"
)
const (
accessTokenTTL = 60 * time.Minute
refreshTokenTTL = 168 * time.Hour // 1 week
)
type JwtAuth struct {
apiKey string
userID uint64
name string
email string
permissions map[string]uint8
}
func NewJwtAuth(apiKey string, userID uint64, userName string, email string, permissions map[string]uint8) *JwtAuth {
return &JwtAuth{apiKey: apiKey, userID: userID, name: userName, email: email, permissions: permissions}
}
// GenerateTokens generates access & refresh tokens
func (ja *JwtAuth) GenerateTokens() (string, string, error) {
accessToken, err := ja.GenerateAccessToken().SignedString([]byte(ja.apiKey))
if err != nil {
return "", "", err
}
refreshToken, err := ja.GenerateRefreshToken().SignedString([]byte(ja.apiKey))
if err != nil {
return "", "", err
}
return accessToken, refreshToken, nil
}
// GenerateAccessToken generates access token
func (ja *JwtAuth) GenerateAccessToken() *jwt.Token {
return jwt.NewWithClaims(jwt.SigningMethodHS256, &AccessTokenClaims{
jwt.StandardClaims{
ExpiresAt: time.Now().Add(accessTokenTTL).Unix(),
IssuedAt: time.Now().Unix(),
},
ja.userID,
ja.name,
ja.email,
ja.permissions,
})
}
// GenerateRefreshToken generate refresh token
func (ja *JwtAuth) GenerateRefreshToken() *jwt.Token {
return jwt.NewWithClaims(jwt.SigningMethodHS256, &RefreshTokenClaims{
jwt.StandardClaims{
ExpiresAt: time.Now().Add(refreshTokenTTL).Unix(),
IssuedAt: time.Now().Unix(),
},
ja.userID,
})
}