github.com/lingyao2333/mo-zero@v1.4.1/rest/token/tokenparser_test.go (about) 1 package token 2 3 import ( 4 "net/http" 5 "net/http/httptest" 6 "testing" 7 "time" 8 9 "github.com/golang-jwt/jwt/v4" 10 "github.com/lingyao2333/mo-zero/core/timex" 11 "github.com/stretchr/testify/assert" 12 ) 13 14 func TestTokenParser(t *testing.T) { 15 const ( 16 key = "14F17379-EB8F-411B-8F12-6929002DCA76" 17 prevKey = "B63F477D-BBA3-4E52-96D3-C0034C27694A" 18 ) 19 keys := []struct { 20 key string 21 prevKey string 22 }{ 23 { 24 key, 25 prevKey, 26 }, 27 { 28 key, 29 "", 30 }, 31 } 32 33 for _, pair := range keys { 34 req := httptest.NewRequest(http.MethodGet, "http://localhost", http.NoBody) 35 token, err := buildToken(key, map[string]interface{}{ 36 "key": "value", 37 }, 3600) 38 assert.Nil(t, err) 39 req.Header.Set("Authorization", "Bearer "+token) 40 41 parser := NewTokenParser(WithResetDuration(time.Minute)) 42 tok, err := parser.ParseToken(req, pair.key, pair.prevKey) 43 assert.Nil(t, err) 44 assert.Equal(t, "value", tok.Claims.(jwt.MapClaims)["key"]) 45 } 46 } 47 48 func TestTokenParser_Expired(t *testing.T) { 49 const ( 50 key = "14F17379-EB8F-411B-8F12-6929002DCA76" 51 prevKey = "B63F477D-BBA3-4E52-96D3-C0034C27694A" 52 ) 53 req := httptest.NewRequest(http.MethodGet, "http://localhost", http.NoBody) 54 token, err := buildToken(key, map[string]interface{}{ 55 "key": "value", 56 }, 3600) 57 assert.Nil(t, err) 58 req.Header.Set("Authorization", "Bearer "+token) 59 60 parser := NewTokenParser(WithResetDuration(time.Second)) 61 tok, err := parser.ParseToken(req, key, prevKey) 62 assert.Nil(t, err) 63 assert.Equal(t, "value", tok.Claims.(jwt.MapClaims)["key"]) 64 tok, err = parser.ParseToken(req, key, prevKey) 65 assert.Nil(t, err) 66 assert.Equal(t, "value", tok.Claims.(jwt.MapClaims)["key"]) 67 parser.resetTime = timex.Now() - time.Hour 68 tok, err = parser.ParseToken(req, key, prevKey) 69 assert.Nil(t, err) 70 assert.Equal(t, "value", tok.Claims.(jwt.MapClaims)["key"]) 71 } 72 73 func buildToken(secretKey string, payloads map[string]interface{}, seconds int64) (string, error) { 74 now := time.Now().Unix() 75 claims := make(jwt.MapClaims) 76 claims["exp"] = now + seconds 77 claims["iat"] = now 78 for k, v := range payloads { 79 claims[k] = v 80 } 81 82 token := jwt.New(jwt.SigningMethodHS256) 83 token.Claims = claims 84 85 return token.SignedString([]byte(secretKey)) 86 }