rpc_signature_composer.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Licensed under the Apache License, Version 2.0 (the "License");
  3. * you may not use this file except in compliance with the License.
  4. * You may obtain a copy of the License at
  5. *
  6. * http://www.apache.org/licenses/LICENSE-2.0
  7. *
  8. * Unless required by applicable law or agreed to in writing, software
  9. * distributed under the License is distributed on an "AS IS" BASIS,
  10. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. * See the License for the specific language governing permissions and
  12. * limitations under the License.
  13. */
  14. package auth
  15. import (
  16. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
  17. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
  18. "net/url"
  19. "sort"
  20. "strings"
  21. )
  22. func signRpcRequest(request *requests.RpcRequest, signer Signer, regionId string) {
  23. completeRpcSignParams(request, signer, regionId)
  24. stringToSign := buildRpcStringToSign(request)
  25. signature := signer.Sign(stringToSign, "&")
  26. request.QueryParams["Signature"] = signature
  27. }
  28. func completeRpcSignParams(request *requests.RpcRequest, signer Signer, regionId string) {
  29. queryParams := request.QueryParams
  30. queryParams["Version"] = request.GetVersion()
  31. queryParams["Action"] = request.GetActionName()
  32. queryParams["Format"] = request.GetAcceptFormat()
  33. queryParams["Timestamp"] = utils.GetTimeInFormatISO8601()
  34. queryParams["SignatureMethod"] = signer.GetName()
  35. queryParams["SignatureType"] = signer.GetType()
  36. queryParams["SignatureVersion"] = signer.GetVersion()
  37. queryParams["SignatureNonce"] = utils.GetUUIDV4()
  38. queryParams["AccessKeyId"] = signer.GetAccessKeyId()
  39. if _, contains := queryParams["RegionId"]; !contains {
  40. queryParams["RegionId"] = regionId
  41. }
  42. if extraParam := signer.GetExtraParam(); extraParam != nil {
  43. for key, value := range extraParam {
  44. queryParams[key] = value
  45. }
  46. }
  47. request.Headers["Content-Type"] = requests.Form
  48. formString := utils.GetUrlFormedMap(request.FormParams)
  49. request.Content = []byte(formString)
  50. }
  51. func buildRpcStringToSign(request *requests.RpcRequest) (stringToSign string) {
  52. signParams := make(map[string]string)
  53. for key, value := range request.QueryParams {
  54. signParams[key] = value
  55. }
  56. for key, value := range request.FormParams {
  57. signParams[key] = value
  58. }
  59. // sort params by key
  60. var paramKeySlice []string
  61. for key := range signParams {
  62. paramKeySlice = append(paramKeySlice, key)
  63. }
  64. sort.Strings(paramKeySlice)
  65. stringToSign = utils.GetUrlFormedMap(signParams)
  66. stringToSign = strings.Replace(stringToSign, "+", "%20", -1)
  67. stringToSign = strings.Replace(stringToSign, "*", "%2A", -1)
  68. stringToSign = strings.Replace(stringToSign, "%7E", "~", -1)
  69. stringToSign = url.QueryEscape(stringToSign)
  70. stringToSign = request.Method + "&%2F&" + stringToSign
  71. return
  72. }