-
Notifications
You must be signed in to change notification settings - Fork 0
/
jwt.go
executable file
·88 lines (65 loc) · 1.96 KB
/
jwt.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
package jwt
import (
"errors"
"github.com/dgrijalva/jwt-go"
"mynsb-api/internal/filesint"
"time"
"mynsb-api/internal/util"
)
// NOTE ========== THE jwt PACKAGE ONLY TAKES THE JWTData struct
// JWTData struct for dealing with JWTData
type JWTData struct {
User string
Password string
Permissions []string
}
// UTILITY FUNCTIONS
// GenJWT generates a JWT token based off the userData provided
func GenJWT(user JWTData) (string, error) {
token := jwt.New(jwt.GetSigningMethod("HS256"))
oneMonth := time.Hour * 24 * 30
claims := token.Claims.(jwt.MapClaims)
claims["User"] = user.User
claims["Password"] = user.Password
claims["Permissions"] = user.Permissions
claims["Expires"] = time.Now().In(util.TIMEZONE).Add(oneMonth)
// Get the private key
privateKey, err := filesint.DataDump("sensitive", "/keys/priv.txt")
if err != nil {
return "", errors.New("error generating jwt")
}
// Generate the signed token
signedToken, err := token.SignedString(privateKey)
if err != nil {
return "", errors.New("error generating jwt")
}
return signedToken, nil
}
// ReadJWT takes a JWT token and decodes it into a JWTData object
func ReadJWT(token string) (JWTData, error) {
var permissions []string
// Decode token
tokenData, err := jwt.Parse(token, func(token *jwt.Token) (interface{}, error) {
// Get the private key to decode the token
privateKey, err := filesint.DataDump("sensitive", "/keys/priv.txt")
if err != nil {
return nil, errors.New("error parsing jwt")
}
return []byte(privateKey), nil
})
if err != nil || !tokenData.Valid {
return JWTData{}, errors.New("invalid jwt")
}
// Get claims
claims := tokenData.Claims.(jwt.MapClaims)
// Convert the permissions to a string array
perms := claims["Permissions"].([]interface{})
for _, b := range perms {
permissions = append(permissions, b.(string))
}
return JWTData{
User: claims["User"].(string),
Password: claims["Password"].(string),
Permissions: permissions,
}, nil
}