github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/auth/token/token_test.go (about)

     1  package token_test
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/qri-io/qfs"
     9  	"github.com/qri-io/qri/auth/key"
    10  	testkeys "github.com/qri-io/qri/auth/key/test"
    11  	"github.com/qri-io/qri/auth/token"
    12  	token_spec "github.com/qri-io/qri/auth/token/spec"
    13  	"github.com/qri-io/qri/profile"
    14  )
    15  
    16  func TestPrivKeyTokens(t *testing.T) {
    17  	prevTs := token.Timestamp
    18  	token.Timestamp = func() time.Time { return time.Time{} }
    19  	defer func() { token.Timestamp = prevTs }()
    20  
    21  	kd := testkeys.GetKeyData(0)
    22  	tokens, err := token.NewPrivKeySource(kd.PrivKey)
    23  	if err != nil {
    24  		t.Fatal(err)
    25  	}
    26  
    27  	pro := &profile.Profile{
    28  		ID:       profile.IDB58MustDecode(kd.EncodedPeerID),
    29  		Peername: "doug",
    30  	}
    31  
    32  	tokenString, err := tokens.CreateToken(pro, 0)
    33  	if err != nil {
    34  		t.Fatal(err)
    35  	}
    36  
    37  	expect := `eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJRbWVMMm1kVmthMWVhaEtFTmplaEs2dEJ4a2twazVkTlExcU1jZ1dpN0hyYjRCIiwic3ViIjoiUW1lTDJtZFZrYTFlYWhLRU5qZWhLNnRCeGtrcGs1ZE5RMXFNY2dXaTdIcmI0QiIsImNsaWVudFR5cGUiOiJ1c2VyIn0.gHsjIzo3FAumMKt4epHYyw7AbhGRh-jTJbp661Uxobb23kaMX_CEWb5ZWnt5Bll8-bn0JhELtcDkirDM30Jc-E3qpwned1-NdwAO2jUIpeA-accrM-q2AFRTPVN3r8uBqLFbU7AXcF9m_HKvywTb99KySHqS1hx9MlmlFd3S5EC58aCdL7fYG38m1Rmzrksd9v196BG1VnYFD8Mg8tee06tE7u_8MDhDZ_CsBRXpoilYadEIg1PR1ElcVR7OQGA1yjw2cUibG1K8fAcfVjOC0aecbVFLbxs9wPbiqXdgOkJVpTKTFxdqE2CfI7fEeMLOcS9R5oJSDxftMS2vtl4HbA`
    38  	if expect != tokenString {
    39  		t.Errorf("token mismatch. expected: %q.\ngot: %q", expect, tokenString)
    40  	}
    41  
    42  	tokenWithExpiryString, err := tokens.CreateToken(pro, time.Hour)
    43  	expect = `eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi02MjEzNTU5MzIwMCwiaXNzIjoiUW1lTDJtZFZrYTFlYWhLRU5qZWhLNnRCeGtrcGs1ZE5RMXFNY2dXaTdIcmI0QiIsInN1YiI6IlFtZUwybWRWa2ExZWFoS0VOamVoSzZ0Qnhra3BrNWROUTFxTWNnV2k3SHJiNEIiLCJjbGllbnRUeXBlIjoidXNlciJ9.IRzNQWFVUZ4VxpcUFmcwRTfMpl85AVIlmdDkGb8qixYaO7gXBSGKL4_XG5yKjqQS5VTSWI1fuYeihs9CbK8sx8luUJXTzTatDNQFAMO4L-76QG7fsZgcaLF4ATGQ0HrxHmDoYlJkRB2tg8TlQ0XlyyRyDWrLxuMtmAUeoSUA97nU7F2IcvloPZEKsV9DU-vxTSLNzV29PhI2oSHhOWHPST9g7gQ39ZH1SX05iNgE-SD55IPZDTgkGZwbeACBrINfZIrAC5_UmCJ-YaUhiPRmCwGY0NoDZTQxPhhc6fJRd8Dgu9gdC1E5-ccOcCADSbXzdcBpoELXguwPlpjRvcqZuw`
    44  	if expect != tokenWithExpiryString {
    45  		t.Errorf("token mismatch. expected: %q.\ngot: %q", expect, tokenWithExpiryString)
    46  	}
    47  
    48  	token_spec.AssertTokenSourceSpec(t, func(ctx context.Context) token.Source {
    49  		source, err := token.NewPrivKeySource(kd.PrivKey)
    50  		if err != nil {
    51  			panic(err)
    52  		}
    53  		return source
    54  	})
    55  }
    56  
    57  func TestTokenStore(t *testing.T) {
    58  	fs := qfs.NewMemFS()
    59  
    60  	token_spec.AssertTokenStoreSpec(t, func(ctx context.Context) token.Store {
    61  		ts, err := token.NewStore("tokens.json", fs)
    62  		if err != nil {
    63  			panic(err)
    64  		}
    65  		return ts
    66  	})
    67  }
    68  
    69  func TestNewPrivKeyAuthToken(t *testing.T) {
    70  	ctx := context.Background()
    71  	// create a token from a private key
    72  	kd := testkeys.GetKeyData(0)
    73  	str, err := token.NewPrivKeyAuthToken(kd.PrivKey, kd.KeyID.String(), 0)
    74  	if err != nil {
    75  		t.Fatal(err)
    76  	}
    77  
    78  	// prove we can parse a token with a store that only has a public key
    79  	ks, err := key.NewMemStore()
    80  	if err != nil {
    81  		t.Fatal(err)
    82  	}
    83  	if err := ks.AddPubKey(ctx, kd.KeyID, kd.PrivKey.GetPublic()); err != nil {
    84  		t.Fatal(err)
    85  	}
    86  
    87  	_, err = token.ParseAuthToken(ctx, str, ks)
    88  	if err != nil {
    89  		t.Fatal(err)
    90  	}
    91  }