github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/downloader/signers.go (about)

     1  package downloader
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/url"
     7  	"strings"
     8  	"time"
     9  
    10  	"github.com/qiniu/go-sdk/v7/storagev2/credentials"
    11  )
    12  
    13  type credentialsSigner struct {
    14  	credentials credentials.CredentialsProvider
    15  }
    16  
    17  // 创建基于七牛鉴权的下载 URL 签名
    18  func NewCredentialsSigner(credentials credentials.CredentialsProvider) Signer {
    19  	return &credentialsSigner{credentials}
    20  }
    21  
    22  func (signer credentialsSigner) Sign(ctx context.Context, u *url.URL, options *SignOptions) error {
    23  	if options == nil {
    24  		options = &SignOptions{}
    25  	}
    26  	ttl := options.TTL
    27  	if ttl == 0 {
    28  		ttl = 3 * time.Minute
    29  	}
    30  
    31  	cred, err := signer.credentials.Get(ctx)
    32  	if err != nil {
    33  		return err
    34  	}
    35  	u.RawQuery += signURL(u.String(), cred, time.Now().Add(ttl).Unix())
    36  	return nil
    37  }
    38  
    39  func signURL(url string, cred *credentials.Credentials, deadline int64) string {
    40  	var appendUrl string
    41  
    42  	if isURLSigned(url) {
    43  		return ""
    44  	}
    45  
    46  	urlToSign := url
    47  	if strings.Contains(url, "?") {
    48  		appendUrl = fmt.Sprintf("&e=%d", deadline)
    49  		urlToSign += appendUrl
    50  	} else {
    51  		appendUrl = fmt.Sprintf("e=%d", deadline)
    52  		urlToSign += "?"
    53  		urlToSign += appendUrl
    54  	}
    55  	token := cred.Sign([]byte(urlToSign))
    56  	return fmt.Sprintf("%s&token=%s", appendUrl, token)
    57  }
    58  
    59  func isURLSigned(url string) bool {
    60  	return (strings.Contains(url, "&e=") || strings.Contains(url, "?e=")) &&
    61  		strings.Contains(url, "&token=")
    62  }