Skip to content

Commit 72d8904

Browse files
author
jojoliang
committed
add credential
1 parent 2130602 commit 72d8904

File tree

5 files changed

+162
-23
lines changed

5 files changed

+162
-23
lines changed

auth.go

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ type CVMSecurityCredentials struct {
339339
Code string `json:",omitempty"`
340340
}
341341

342-
type CVMCredentialsTransport struct {
342+
type CVMCredentialTransport struct {
343343
RoleName string
344344
Transport http.RoundTripper
345345
secretID string
@@ -349,7 +349,7 @@ type CVMCredentialsTransport struct {
349349
rwLocker sync.RWMutex
350350
}
351351

352-
func (t *CVMCredentialsTransport) GetRoles() ([]string, error) {
352+
func (t *CVMCredentialTransport) GetRoles() ([]string, error) {
353353
urlname := fmt.Sprintf("%s://%s/%s", defaultCVMSchema, defaultCVMMetaHost, defaultCVMCredURI)
354354
resp, err := http.Get(urlname)
355355
if err != nil {
@@ -372,7 +372,7 @@ func (t *CVMCredentialsTransport) GetRoles() ([]string, error) {
372372
}
373373

374374
// https://cloud.tencent.com/document/product/213/4934
375-
func (t *CVMCredentialsTransport) UpdateCredential(now int64) (string, string, string, error) {
375+
func (t *CVMCredentialTransport) UpdateCredential(now int64) (string, string, string, error) {
376376
t.rwLocker.Lock()
377377
defer t.rwLocker.Unlock()
378378
if t.expiredTime > now+defaultCVMAuthExpire {
@@ -408,7 +408,7 @@ func (t *CVMCredentialsTransport) UpdateCredential(now int64) (string, string, s
408408
return t.secretID, t.secretKey, t.sessionToken, nil
409409
}
410410

411-
func (t *CVMCredentialsTransport) GetCredential() (string, string, string, error) {
411+
func (t *CVMCredentialTransport) GetCredential() (string, string, string, error) {
412412
now := time.Now().Unix()
413413
t.rwLocker.RLock()
414414
// 提前 defaultCVMAuthExpire 获取重新获取临时密钥
@@ -426,7 +426,7 @@ func (t *CVMCredentialsTransport) GetCredential() (string, string, string, error
426426
return t.secretID, t.secretKey, t.sessionToken, nil
427427
}
428428

429-
func (t *CVMCredentialsTransport) RoundTrip(req *http.Request) (*http.Response, error) {
429+
func (t *CVMCredentialTransport) RoundTrip(req *http.Request) (*http.Response, error) {
430430
ak, sk, token, err := t.GetCredential()
431431
if err != nil {
432432
return nil, err
@@ -440,9 +440,59 @@ func (t *CVMCredentialsTransport) RoundTrip(req *http.Request) (*http.Response,
440440
return resp, err
441441
}
442442

443-
func (t *CVMCredentialsTransport) transport() http.RoundTripper {
443+
func (t *CVMCredentialTransport) transport() http.RoundTripper {
444444
if t.Transport != nil {
445445
return t.Transport
446446
}
447447
return http.DefaultTransport
448448
}
449+
450+
type CredentialTransport struct {
451+
Transport http.RoundTripper
452+
Credential CredentialIface
453+
}
454+
455+
func (t *CredentialTransport) RoundTrip(req *http.Request) (*http.Response, error) {
456+
ak, sk, token := t.Credential.GetSecretId(), t.Credential.GetSecretKey(), t.Credential.GetToken()
457+
458+
req = cloneRequest(req)
459+
// 增加 Authorization header
460+
authTime := NewAuthTime(defaultAuthExpire)
461+
AddAuthorizationHeader(ak, sk, token, req, authTime)
462+
463+
resp, err := t.transport().RoundTrip(req)
464+
return resp, err
465+
}
466+
467+
func (t *CredentialTransport) transport() http.RoundTripper {
468+
if t.Transport != nil {
469+
return t.Transport
470+
}
471+
return http.DefaultTransport
472+
}
473+
474+
type CredentialIface interface {
475+
GetSecretId() string
476+
GetToken() string
477+
GetSecretKey() string
478+
}
479+
480+
func NewTokenCredential(secretId, secretKey, token string) *Credential {
481+
return &Credential{
482+
SecretID: secretId,
483+
SecretKey: secretKey,
484+
SessionToken: token,
485+
}
486+
}
487+
488+
func (c *Credential) GetSecretKey() string {
489+
return c.SecretKey
490+
}
491+
492+
func (c *Credential) GetSecretId() string {
493+
return c.SecretID
494+
}
495+
496+
func (c *Credential) GetToken() string {
497+
return c.SessionToken
498+
}

auth_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func TestAuthorizationTransport(t *testing.T) {
5757
client.doAPI(context.Background(), req, nil, true)
5858
}
5959

60-
func TestCVMCredentialsTransport(t *testing.T) {
60+
func TestCVMCredentialTransport(t *testing.T) {
6161
setup()
6262
defer teardown()
6363
uri := client.BaseURL.BucketURL.String()
@@ -67,15 +67,15 @@ func TestCVMCredentialsTransport(t *testing.T) {
6767

6868
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
6969
if r.Header.Get("x-cos-security-token") != token {
70-
t.Errorf("CVMCredentialsTransport x-cos-security-token error, want:%v, return:%v\n", token, r.Header.Get("x-cos-security-token"))
70+
t.Errorf("CVMCredentialTransport x-cos-security-token error, want:%v, return:%v\n", token, r.Header.Get("x-cos-security-token"))
7171
}
7272
auth := r.Header.Get("Authorization")
7373
if auth == "" {
74-
t.Error("CVMCredentialsTransport didn't add Authorization header")
74+
t.Error("CVMCredentialTransport didn't add Authorization header")
7575
}
7676
field := strings.Split(auth, "&")
7777
if len(field) != 7 {
78-
t.Errorf("CVMCredentialsTransport Authorization header format error: %v\n", auth)
78+
t.Errorf("CVMCredentialTransport Authorization header format error: %v\n", auth)
7979
}
8080
st_et := strings.Split(strings.Split(field[2], "=")[1], ";")
8181
st, _ := strconv.ParseInt(st_et[0], 10, 64)
@@ -91,7 +91,7 @@ func TestCVMCredentialsTransport(t *testing.T) {
9191
req.Header.Add("Host", host)
9292
expect := newAuthorization(ak, sk, req, authTime, true)
9393
if expect != auth {
94-
t.Errorf("CVMCredentialsTransport Authorization error, want:%v, return:%v\n", expect, auth)
94+
t.Errorf("CVMCredentialTransport Authorization error, want:%v, return:%v\n", expect, auth)
9595
}
9696
})
9797

@@ -116,7 +116,7 @@ func TestCVMCredentialsTransport(t *testing.T) {
116116
}`, ak, sk, time.Now().Unix()+3600, token))
117117
})
118118

119-
client.client.Transport = &CVMCredentialsTransport{}
119+
client.client.Transport = &CVMCredentialTransport{}
120120
req, _ := http.NewRequest("GET", client.BaseURL.BucketURL.String(), nil)
121121
client.doAPI(context.Background(), req, nil, true)
122122

cos.go

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,17 +160,35 @@ type Credential struct {
160160
}
161161

162162
func (c *Client) GetCredential() *Credential {
163-
auth, ok := c.client.Transport.(*AuthorizationTransport)
164-
if !ok {
165-
return nil
163+
if auth, ok := c.client.Transport.(*AuthorizationTransport); ok {
164+
auth.rwLocker.Lock()
165+
defer auth.rwLocker.Unlock()
166+
return &Credential{
167+
SecretID: auth.SecretID,
168+
SecretKey: auth.SecretKey,
169+
SessionToken: auth.SessionToken,
170+
}
171+
}
172+
if auth, ok := c.client.Transport.(*CVMCredentialTransport); ok {
173+
ak, sk, token, err := auth.GetCredential()
174+
if err != nil {
175+
return nil
176+
}
177+
return &Credential{
178+
SecretID: ak,
179+
SecretKey: sk,
180+
SessionToken: token,
181+
}
166182
}
167-
auth.rwLocker.Lock()
168-
defer auth.rwLocker.Unlock()
169-
return &Credential{
170-
SecretID: auth.SecretID,
171-
SecretKey: auth.SecretKey,
172-
SessionToken: auth.SessionToken,
183+
if auth, ok := c.client.Transport.(*CredentialTransport); ok {
184+
ak, sk, token := auth.Credential.GetSecretId(), auth.Credential.GetSecretKey(), auth.Credential.GetToken()
185+
return &Credential{
186+
SecretID: ak,
187+
SecretKey: sk,
188+
SessionToken: token,
189+
}
173190
}
191+
return nil
174192
}
175193

176194
func (c *Client) newRequest(ctx context.Context, baseURL *url.URL, uri, method string, body interface{}, optQuery interface{}, optHeader interface{}) (req *http.Request, err error) {
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/url"
7+
8+
"net/http"
9+
"os"
10+
11+
"github.com/tencentyun/cos-go-sdk-v5"
12+
"github.com/tencentyun/cos-go-sdk-v5/debug"
13+
)
14+
15+
func log_status(err error) {
16+
if err == nil {
17+
return
18+
}
19+
if cos.IsNotFoundError(err) {
20+
// WARN
21+
fmt.Println("WARN: Resource is not existed")
22+
} else if e, ok := cos.IsCOSError(err); ok {
23+
fmt.Printf("ERROR: Code: %v\n", e.Code)
24+
fmt.Printf("ERROR: Message: %v\n", e.Message)
25+
fmt.Printf("ERROR: Resource: %v\n", e.Resource)
26+
fmt.Printf("ERROR: RequestId: %v\n", e.RequestID)
27+
// ERROR
28+
} else {
29+
fmt.Printf("ERROR: %v\n", err)
30+
// ERROR
31+
}
32+
}
33+
34+
type Credential struct {
35+
}
36+
37+
// 需实现 CredentialIface 三个方法
38+
func (c *Credential) GetSecretId() string {
39+
return os.Getenv("COS_SECRETID")
40+
}
41+
42+
func (c *Credential) GetSecretKey() string {
43+
return os.Getenv("COS_SECRETKEY")
44+
}
45+
46+
func (c *Credential) GetToken() string {
47+
return ""
48+
}
49+
50+
func main() {
51+
u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com")
52+
b := &cos.BaseURL{BucketURL: u}
53+
c := cos.NewClient(b, &http.Client{
54+
// 使用 CredentialsTransport
55+
Transport: &cos.CredentialTransport{
56+
// 通过 CredentialIface 获取密钥, 需实现 GetSecretKey,GetSecretId,GetToken 方法。
57+
Credential: &Credential{},
58+
Transport: &debug.DebugRequestTransport{
59+
RequestHeader: true,
60+
// Notice when put a large file and set need the request body, might happend out of memory error.
61+
RequestBody: false,
62+
ResponseHeader: true,
63+
ResponseBody: false,
64+
},
65+
},
66+
})
67+
68+
name := "exampleobject"
69+
_, err := c.Object.Get(context.Background(), name, nil)
70+
log_status(err)
71+
}

example/object/get_with_cvm_role.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ func main() {
3434
u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com")
3535
b := &cos.BaseURL{BucketURL: u}
3636
c := cos.NewClient(b, &http.Client{
37-
// 使用 CVMCredentialsTransport
38-
Transport: &cos.CVMCredentialsTransport{
37+
// 使用 CVMCredentialTransport
38+
Transport: &cos.CVMCredentialTransport{
3939
Transport: &debug.DebugRequestTransport{
4040
RequestHeader: true,
4141
// Notice when put a large file and set need the request body, might happend out of memory error.

0 commit comments

Comments
 (0)