diff --git a/sdk/auth/credentials/access_key_creditial.go b/sdk/auth/credentials/access_key_credential.go similarity index 100% rename from sdk/auth/credentials/access_key_creditial.go rename to sdk/auth/credentials/access_key_credential.go diff --git a/sdk/auth/credentials/sts_token_credential.go b/sdk/auth/credentials/sts_token_credential.go new file mode 100644 index 0000000..ef5847c --- /dev/null +++ b/sdk/auth/credentials/sts_token_credential.go @@ -0,0 +1,15 @@ +package credentials + +type StdTokenCredential struct { + AccessKeyId string + AccessKeySecret string + AccessKeyFrom string +} + +func NewStsTokenCredential(accessKeyId, accessKeySecret, accessFrom string) *StdTokenCredential { + return &StdTokenCredential{ + AccessKeyId: accessKeyId, + AccessKeySecret: accessKeySecret, + AccessKeyFrom: accessFrom, + } +} diff --git a/sdk/auth/rpc_signature_composer.go b/sdk/auth/rpc_signature_composer.go index 2c32042..049f80f 100644 --- a/sdk/auth/rpc_signature_composer.go +++ b/sdk/auth/rpc_signature_composer.go @@ -26,7 +26,9 @@ func signRpcRequest(request requests.AcsRequest, signer Signer) (err error) { request.SetStringToSign(stringToSign) signature := signer.Sign(stringToSign, "&") request.GetQueryParams()["sign"] = signature - debug("grsdk sign %s", signature) + debug("GrSdk sign: %s", signature) + debug("GrSdk sign string: %s", stringToSign) + debug("GrSdk sign: \r\n") return } @@ -107,7 +109,7 @@ func unsignRpcRequest(request *http.Request, signer Signer) (err error) { stringToSign = strings.Replace(stringToSign, "%7E", "~", -1) stringToSign = url.QueryEscape(stringToSign) stringToSign = request.Method + "&%2F&" + stringToSign - debug("grsdk signstring %s", stringToSign) + debug("GrSdk sign: %s", stringToSign) if timestamp, err := strconv.ParseInt(signParams["access_time"], 10, 64); err != nil { return err diff --git a/sdk/auth/signer.go b/sdk/auth/signer.go index 86ffa8c..2b29ec5 100644 --- a/sdk/auth/signer.go +++ b/sdk/auth/signer.go @@ -22,6 +22,8 @@ func NewSignerWithCredential(credential Credential, commonApi func(request *requ signer = signers.NewAccessKeySigner(instance) case *credentials.BaseCredential: signer = signers.NewAccessKeySigner(instance.ToAccessKeyCredential()) + case *credentials.StdTokenCredential: + signer = signers.NewStsTokenSigner(instance) default: err = errors.New("UnsupportedCredentialErrorCode = SDK.UnsupportedCredential") } diff --git a/sdk/auth/signers/sts_token_signer.go b/sdk/auth/signers/sts_token_signer.go new file mode 100644 index 0000000..c4bc69b --- /dev/null +++ b/sdk/auth/signers/sts_token_signer.go @@ -0,0 +1,41 @@ +package signers + +import ( + "crypto/md5" + "fmt" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/credentials" +) + +type StsTokenSigner struct { + credential *credentials.StdTokenCredential +} + +func (signer *StsTokenSigner) GetAccessKeyId() (string, error) { + return signer.credential.AccessKeyId, nil +} + +func (signer *StsTokenSigner) GetAccessKeyFrom() (string, error) { + return signer.credential.AccessKeyFrom, nil +} + +func (*StsTokenSigner) GetName() string { + return "MD5" +} + +func (signer *StsTokenSigner) Sign(stringToSign, secretSuffix string) string { + secret := signer.credential.AccessKeySecret + secretSuffix + return Md5(stringToSign, secret) +} + +func NewStsTokenSigner(credential *credentials.StdTokenCredential) *StsTokenSigner { + return &StsTokenSigner{ + credential: credential, + } +} + +func Md5(source, secret string) string { + data := []byte(fmt.Sprintf("%s##%s", secret, source)) + has := md5.Sum(data) + md5str := fmt.Sprintf("%x", has) + return md5str +} diff --git a/sdk/client.go b/sdk/client.go index d636928..e638a59 100644 --- a/sdk/client.go +++ b/sdk/client.go @@ -1,6 +1,7 @@ package sdk import ( + "bytes" "context" "crypto/tls" "fmt" @@ -11,6 +12,7 @@ import ( "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils" "net" "net/http" + "net/http/httputil" "net/url" "os" "regexp" @@ -91,6 +93,16 @@ func (client *Client) InitWithAccessKey(accessKeyId, accessKeySecret, accessKeyF return client.InitWithOptions(config, credential) } +func (client *Client) InitWithStsToken(accessKeyId, accessKeySecret, accessKeyFrom string) (err error) { + config := client.InitWithConfig() + credential := &credentials.StdTokenCredential{ + AccessKeyId: accessKeyId, + AccessKeySecret: accessKeySecret, + AccessKeyFrom: accessKeyFrom, + } + return client.InitWithOptions(config, credential) +} + func (client *Client) InitWithOptions(config *Config, credential auth.Credential) (err error) { client.httpClient = &http.Client{} client.config = config @@ -227,8 +239,10 @@ func (client *Client) DoActionWithSigner(request requests.AcsRequest, response r client.httpClient.Transport = trans } - var httpResponse *http.Response + dump, err := httputil.DumpRequest(httpRequest, true) + debug("client %s", bytes.NewBuffer(dump).String()) + var httpResponse *http.Response httpResponse, err = hookDo(client.httpClient.Do)(httpRequest) if err != nil { return @@ -285,8 +299,6 @@ func (client *Client) buildRequestWithSigner(request requests.AcsRequest, signer userAgent := DefaultUserAgent httpRequest.Header.Set("User-Agent", userAgent) - debug("%s", request.GetStringToSign()) - debug("%s", httpRequest.Method) return } diff --git a/sdk/requests/request.go b/sdk/requests/request.go index 437fb73..67ee426 100644 --- a/sdk/requests/request.go +++ b/sdk/requests/request.go @@ -202,8 +202,8 @@ func defaultBaseRequest() (request *baseRequest) { Method: GET, QueryParams: make(map[string]string), Headers: map[string]string{ - "gr-sdk-client": "golang/1.14", - "gr-sdk-invoke-type": "normal", + "Gr-Sdk-Client": "golang/1.14", + "Gr-Sdk-Invoke-Type": "normal", "Accept-Encoding": Json, }, FormParams: make(map[string]string), diff --git a/services/jedi/send_sms.go b/services/jedi/send_sms.go index d4ee5da..5584423 100644 --- a/services/jedi/send_sms.go +++ b/services/jedi/send_sms.go @@ -7,10 +7,9 @@ import ( type SendSmsRequest struct { *requests.RpcRequest - User string `position:"Query" field:"user" default:"" ` - Code string `position:"Query" field:"code" default:"" ` - Params string `position:"Query" field:"params" default:"" ` - TestBody string `position:"Body" field:"test_body" default:"2121" ` + User string `position:"Query" field:"user" default:"" ` + Code string `position:"Query" field:"code" default:"" ` + Params string `position:"Query" field:"params" default:"" ` } type SendSmsResponseData struct { diff --git a/services/jedi/test_demo.go b/services/jedi/test_demo.go index 8fa4cfa..e2ede2c 100644 --- a/services/jedi/test_demo.go +++ b/services/jedi/test_demo.go @@ -7,15 +7,16 @@ import ( type DemoTestRequest struct { *requests.RpcRequest - Param1 string `position:"Query" field:"param_1" default:"" ` - Param2 int `position:"Query" field:"param_2" default:"10086" ` - Param3 bool `position:"Query" field:"param_3" default:"false" ` + Param1 string `position:"Query" field:"param_1" default:"" ` + Param2 int `position:"Query" field:"param_2" default:"10086" ` + Param3 bool `position:"Query" field:"param_3" default:"false" ` + ParamBody string `position:"Body" field:"param_body" default:"foobar" ` } func CreateDemoTestRequest() (req *DemoTestRequest) { req = &DemoTestRequest{RpcRequest: &requests.RpcRequest{}} req.InitWithApiInfo(HOST, VERSION, "/api/sms/Index") - req.Method = requests.GET + req.Method = requests.POST return }