Skip to content

Commit eb1b57b

Browse files
committed
jwt test
1 parent d953951 commit eb1b57b

File tree

5 files changed

+154
-0
lines changed

5 files changed

+154
-0
lines changed

jwt/go.mod

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module jwt-test
2+
3+
go 1.15
4+
5+
require github.com/dgrijalva/jwt-go v3.2.0+incompatible

jwt/go.sum

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
github.com/dgrijalva/jwt-go v1.0.2 h1:KPldsxuKGsS2FPWsNeg9ZO18aCrGKujPoWXn2yo+KQM=
2+
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
3+
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=

jwt/jwt-test.go

+124
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
"log"
7+
"strings"
8+
"time"
9+
10+
jwt "github.com/dgrijalva/jwt-go"
11+
)
12+
13+
// SM ...
14+
const (
15+
SM = "RS512"
16+
SECRET = "anypassword"
17+
)
18+
19+
// CustomClaims ...
20+
type CustomClaims struct {
21+
Foo string `json:"foo"`
22+
jwt.StandardClaims
23+
}
24+
25+
// Generate keys using: https://www.csfieldguide.org.nz/en/interactives/rsa-key-generator/
26+
// Keysize: 1024 and PKCS #8 (base64)
27+
func generateRSAToken(prv string) (string, error) {
28+
keyData, err := ioutil.ReadFile(prv)
29+
if err != nil {
30+
return "", err
31+
}
32+
33+
key, err := jwt.ParseRSAPrivateKeyFromPEM(keyData)
34+
if err != nil {
35+
return "", err
36+
}
37+
38+
token := jwt.New(jwt.GetSigningMethod(SM))
39+
token.Claims = CustomClaims{
40+
"bar",
41+
jwt.StandardClaims{
42+
ExpiresAt: time.Now().Add(time.Hour * 24).Unix(),
43+
Issuer: "test",
44+
},
45+
}
46+
47+
return token.SignedString(key)
48+
}
49+
50+
func verifyRSAToken(token, pub string) (bool, error) {
51+
keyData, err := ioutil.ReadFile(pub)
52+
if err != nil {
53+
return false, err
54+
}
55+
56+
key, err := jwt.ParseRSAPublicKeyFromPEM(keyData)
57+
if err != nil {
58+
return false, err
59+
}
60+
61+
parts := strings.Split(token, ".")
62+
method := jwt.GetSigningMethod(SM)
63+
err = method.Verify(strings.Join(parts[0:2], "."), parts[2], key)
64+
if err != nil {
65+
return false, nil
66+
}
67+
68+
return true, nil
69+
}
70+
71+
func generateHASHToken(pwd string) (string, error) {
72+
claims := CustomClaims{
73+
"bar",
74+
jwt.StandardClaims{
75+
ExpiresAt: time.Now().Add(time.Hour * 24).Unix(),
76+
Issuer: "test",
77+
},
78+
}
79+
at := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
80+
return at.SignedString([]byte(pwd))
81+
}
82+
83+
func verifyHASHToken(token, pwd string) (bool, error) {
84+
_, err := jwt.Parse(token, func(t *jwt.Token) (interface{}, error) {
85+
if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
86+
return nil, fmt.Errorf("unexpected signing method: %v", t.Header["alg"])
87+
}
88+
return []byte(pwd), nil
89+
})
90+
return err == nil, err
91+
}
92+
93+
func main() {
94+
pub := "./pub.key"
95+
prv := "./prv.key"
96+
97+
token, err := generateRSAToken(prv)
98+
if err != nil {
99+
log.Fatal(err)
100+
}
101+
102+
fmt.Printf("RSA token: %s\n", token)
103+
104+
valid, err := verifyRSAToken(token, pub)
105+
if err != nil {
106+
log.Fatal(err)
107+
}
108+
109+
fmt.Printf("RSA token validation: %v (%v)\n", valid, err)
110+
111+
token, err = generateHASHToken(SECRET)
112+
if err != nil {
113+
log.Fatal(err)
114+
}
115+
116+
fmt.Printf("HASH token: %s\n", token)
117+
118+
valid, err = verifyHASHToken(token, SECRET)
119+
if err != nil {
120+
log.Fatal(err)
121+
}
122+
123+
fmt.Printf("RSA token validation: %v (%v)\n", valid, err)
124+
}

jwt/prv.key

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIBulEDvfv9Lggr0
3+
mO8E0JcHxOr11Ao5NoqthTX8k/WTDcbvyh8mHdJVE4tY1yx6C/eYYzDvJlC3gB++
4+
IkRuAIyiKd++zBscOuZ0XZDqHwkfEwqgZ0ZUqqcwBypbPxW2+IYfqCKz84qkFrwn
5+
1XwbvAx5hxZl1b8yKFL1eQ6JloVNAgMBAAECgYAw11yj8TBPsAxtVCWQyDj3Jqo5
6+
XHFdzfIy/Ngq9rnh6yGTJP+tptYydc4v8QIrVOKWLyqRonDkw1QDPlBTy62DQsHu
7+
PpBoVLHdDXyvccKWzY/oL9WDHjVIjrvV2A3Zj5tL+chlkc59LWXuJd+4lU5mSF9b
8+
ZKFkRfodrs6CNMfbIQJBAM90wCbSKEp8G2b7x/jF0IY61g21S/cwHjQvuVvykKpO
9+
KsEsm4zmzZt2tMIAcgiBp23OXdos36OGXupLW1FpmLUCQQCefAs9jwg5b3pqlEfv
10+
zBKfCpR+AuC9g6tCkWnpNS+/xgCOhOb+vkYHFVCq2UGdEtpmzcpYrwmIlsK9mEnp
11+
YZE5AkBhAMJoZJQaX/WgLdLPbA+Y9CHqvv8KUiGNXVNavw0N1QcA1I7XT4SMUPEs
12+
VXD8sUNMgNY5kgnwOIBhJWNJqgqRAkAorz9TdjxuQify5E3zSTgei+DC2IpJHFwC
13+
osHFlFnFqVbLP2LtUns3pkknEs69O/HFIl8nlQelgM5NTaLrvphBAkEAr82tsjCe
14+
HH4xwVkRb9bRiPiw/i3C+mwtlLJuD5vaqCRr30Ir3cnJWpqe2Cw6gEg8mZ85Mu2m
15+
gN0xn7EGfRL0Jw==
16+
-----END PRIVATE KEY-----

jwt/pub.key

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCAbpRA737/S4IK9JjvBNCXB8Tq
3+
9dQKOTaKrYU1/JP1kw3G78ofJh3SVROLWNcsegv3mGMw7yZQt4AfviJEbgCMoinf
4+
vswbHDrmdF2Q6h8JHxMKoGdGVKqnMAcqWz8VtviGH6gis/OKpBa8J9V8G7wMeYcW
5+
ZdW/MihS9XkOiZaFTQIDAQAB
6+
-----END PUBLIC KEY-----

0 commit comments

Comments
 (0)