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 }