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  }