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 }