github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/uploader/credentials_uptoken_signer.go (about)

     1  package uploader
     2  
     3  import (
     4  	"context"
     5  	"sync"
     6  	"time"
     7  
     8  	"github.com/qiniu/go-sdk/v7/storagev2/credentials"
     9  	"github.com/qiniu/go-sdk/v7/storagev2/uptoken"
    10  )
    11  
    12  type credentialsUpTokenSigner struct {
    13  	credentials credentials.CredentialsProvider
    14  	bucketName  string
    15  	tokenTtl    time.Duration
    16  	cacheTtl    time.Duration
    17  
    18  	cacheMutux          sync.Mutex
    19  	cachedPolicy        uptoken.PutPolicy
    20  	cachedCredentials   *credentials.Credentials
    21  	policyCachedAt      time.Time
    22  	credentialsCachedAt time.Time
    23  }
    24  
    25  func (signer *credentialsUpTokenSigner) GetPutPolicy(ctx context.Context) (uptoken.PutPolicy, error) {
    26  	var err error
    27  
    28  	signer.cacheMutux.Lock()
    29  	defer signer.cacheMutux.Unlock()
    30  
    31  	now := time.Now()
    32  	if signer.cachedPolicy == nil || signer.policyCachedAt.Add(signer.cacheTtl).Before(now) {
    33  		signer.cachedPolicy, err = uptoken.NewPutPolicy(signer.bucketName, now.Add(signer.tokenTtl))
    34  		if err != nil {
    35  			return nil, err
    36  		}
    37  		signer.policyCachedAt = now
    38  	}
    39  
    40  	return signer.cachedPolicy, nil
    41  }
    42  
    43  func (signer *credentialsUpTokenSigner) GetAccessKey(ctx context.Context) (string, error) {
    44  	cred, err := signer.getCredentials(ctx)
    45  	if err != nil {
    46  		return "", err
    47  	}
    48  	return cred.AccessKey, nil
    49  }
    50  
    51  func (signer *credentialsUpTokenSigner) GetUpToken(ctx context.Context) (string, error) {
    52  	putPolicy, err := signer.GetPutPolicy(ctx)
    53  	if err != nil {
    54  		return "", err
    55  	}
    56  	cred, err := signer.getCredentials(ctx)
    57  	if err != nil {
    58  		return "", err
    59  	}
    60  	return uptoken.NewSigner(putPolicy, cred).GetUpToken(ctx)
    61  }
    62  
    63  func (signer *credentialsUpTokenSigner) getCredentials(ctx context.Context) (*credentials.Credentials, error) {
    64  	var err error
    65  
    66  	signer.cacheMutux.Lock()
    67  	defer signer.cacheMutux.Unlock()
    68  
    69  	now := time.Now()
    70  	if signer.cachedCredentials == nil || signer.credentialsCachedAt.Add(signer.cacheTtl).Before(now) {
    71  		signer.cachedCredentials, err = signer.credentials.Get(ctx)
    72  		if err != nil {
    73  			return nil, err
    74  		}
    75  		signer.credentialsCachedAt = now
    76  	}
    77  
    78  	return signer.cachedCredentials, nil
    79  }
    80  
    81  func newCredentialsUpTokenSigner(credentials credentials.CredentialsProvider, bucketName string, tokenTtl, cacheTtl time.Duration) uptoken.Provider {
    82  	return &credentialsUpTokenSigner{credentials: credentials, bucketName: bucketName, tokenTtl: tokenTtl, cacheTtl: cacheTtl}
    83  }