-
Notifications
You must be signed in to change notification settings - Fork 0
/
jwt_generator.go
83 lines (66 loc) · 2.04 KB
/
jwt_generator.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
package utils
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"github.com/i-akbarshoh/task-manager/pkg/config"
"time"
"github.com/dgrijalva/jwt-go"
)
// Tokens struct to describe tokens object.
type Tokens struct {
Access string
AccExpire int64
Refresh string
}
// GenerateNewTokens func for generate a new Access & Refresh token
func GenerateNewTokens(id string, credentials map[string]string) (*Tokens, error) {
// Generate JWT Access token.
accessToken, expire, err := generateNewAccessToken(id, credentials)
if err != nil {
// Return token generation error.
return nil, err
}
// Generate JWT Refresh token.
refreshToken, err := generateNewRefreshToken()
if err != nil {
// Return token generation error.
return nil, err
}
return &Tokens{
Access: accessToken,
Refresh: refreshToken,
AccExpire: expire,
}, nil
}
func generateNewAccessToken(id string, credentials map[string]string) (string, int64, error) {
claims := jwt.MapClaims{}
claims["id"] = id
claims["role"] = credentials["role"]
// in local server access token ttl = 31 days
if config.C.Environment == "development" {
claims["expires"] = time.Now().Add(time.Hour * 24 * 31).Unix()
} else {
// in staging server access token ttl = a day
claims["expires"] = time.Now().Add(time.Hour * time.Duration(config.C.JWT.Expire)).Unix()
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
t, err := token.SignedString([]byte(config.C.JWT.SigningKey))
if err != nil {
// Return error, it JWT token generation failed.
return "", 0, err
}
return t, claims["expires"].(int64), nil
}
func generateNewRefreshToken() (string, error) {
sha256Hash := sha256.New()
refresh := config.C.JWT.RefreshKey + time.Now().String()
_, err := sha256Hash.Write([]byte(refresh))
if err != nil {
return "", err
}
expireTime := fmt.Sprint(time.Now().Add(time.Hour * time.Duration(config.C.JWT.RExpire)).Unix())
// Create a new refresh token (sha256 string with salt + expire time)
t := hex.EncodeToString(sha256Hash.Sum(nil)) + "." + expireTime
return t, nil
}