Python 如何使用Groovy调用AmazonAPI网关

Python 如何使用Groovy调用AmazonAPI网关,python,amazon-web-services,groovy,aws-api-gateway,Python,Amazon Web Services,Groovy,Aws Api Gateway,我将从M2M云调用API网关,该云内部使用有限版本的Groovy,而我不能使用外部SDK。 因此,我检查了实现的描述和一些代码示例 我找到了文件- 和Python上的示例- 我曾尝试为纯Groovy实现Get方法,但没有成功,导致403错误。这意味着我的access实现有错误: import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec import java.security.InvalidKeyException impo

我将从M2M云调用API网关,该云内部使用有限版本的Groovy,而我不能使用外部SDK。 因此,我检查了实现的描述和一些代码示例

  • 我找到了文件-
  • 和Python上的示例-
我曾尝试为纯Groovy实现Get方法,但没有成功,导致403错误。这意味着我的access实现有错误:

import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import java.security.InvalidKeyException
import java.security.MessageDigest

import org.apache.commons.httpclient.HttpClient
import org.apache.commons.httpclient.methods.GetMethod
import org.apache.commons.httpclient.Header
import groovy.json.JsonSlurper

import java.text.SimpleDateFormat

def method = 'GET'
def service = 'ec2'
def host = 'ec2.amazonaws.com'
def region = 'us-east-1'
def endpoint = 'https://ec2.amazonaws.com'
def request_parameters = 'Action=DescribeRegions&Version=2013-10-15'

def hmac_sha256(byte[] secretKey, String data) {
 try {
    Mac mac = Mac.getInstance("HmacSHA256")
    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "HmacSHA256")
    mac.init(secretKeySpec)
    byte[] digest = mac.doFinal(data.getBytes())
    return digest
   } catch (InvalidKeyException e) {
    throw new RuntimeException("Invalid key exception while converting to HMac SHA256")
  }
}
def hmac_sha256Hex(byte[] secretKey, String data) {
    def result = hmac_sha256(secretKey, data)
    return result.encodeHex()
}
def getSignatureKey(key, dateStamp, regionName, serviceName){
    def kDate = hmac_sha256(('AWS4' + key).getBytes(), dateStamp)
    def kRegion = hmac_sha256(kDate, regionName)
    def kService = hmac_sha256(kRegion, serviceName)
    def kSigning = hmac_sha256(kService, 'aws4_request')
    return kSigning
}
def getHexDigest(text){
    def md = MessageDigest.getInstance("SHA-256")
    md.update(text.getBytes())
    return md.digest().encodeHex()
}

def access_key = 'Access Key'
def secret_key = 'Secret Access Key'
def now = new Date()
def amzFormat = new SimpleDateFormat( "yyyyMMdd'T'HHmmss'Z'" )
def stampFormat = new SimpleDateFormat( "yyyyMMdd" )
def amzDate = amzFormat.format(now)
def dateStamp = stampFormat.format(now)

def canonical_uri = '/' 
def canonical_querystring = request_parameters
def canonical_headers = 'host:' + host + '\n' + 'x-amz-date:' + amzDate + '\n'
def signed_headers = 'host;x-amz-date'

def payload_hash = getHexDigest("")
def canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash

def algorithm = 'AWS4-HMAC-SHA256'
def credential_scope = dateStamp + '/' + region + '/' + service + '/' + 'aws4_request'
def hash_canonical_request = getHexDigest(canonical_request)
def string_to_sign = algorithm + '\n' +  amzDate + '\n' +  credential_scope + '\n' +  hash_canonical_request

def signing_key = getSignatureKey(secret_key, dateStamp, region, service)

def signature = hmac_sha256Hex(signing_key, string_to_sign)
def authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + credential_scope + ', ' +  'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
def request_url = endpoint + '?' + canonical_querystring

def httpClient = new HttpClient()
def get = new GetMethod('https://xxxxx.execute-api.us-east-1.amazonaws.com/Method/id000/')
get.setRequestHeader(new Header("x-amz-date", amzDate))
get.setRequestHeader(new Header("Authorization", authorization_header))

int statusCode = httpClient.executeMethod(get)

if(statusCode >= 200 && statusCode < 300){ 
    def slurper = new JsonSlurper() 
    def response = slurper.parseText(get.getResponseBodyAsString()) 
    logger.debug response
    logger.debug response?.Id
}else{
    logger.debug statusCode
}
导入javax.crypto.Mac
导入javax.crypto.spec.SecretKeySpec
导入java.security.InvalidKeyException
导入java.security.MessageDigest
导入org.apache.commons.httpclient.httpclient
导入org.apache.commons.httpclient.methods.GetMethod
导入org.apache.commons.httpclient.Header
导入groovy.json.JsonSlurper
导入java.text.simpleDataFormat
def方法='GET'
def服务='ec2'
def主机='ec2.amazonaws.com'
def区域='us-east-1'
def端点https://ec2.amazonaws.com'
def请求_参数='操作=描述区域和版本=2013-10-15'
def hmac_sha256(字节[]secretKey,字符串数据){
试一试{
Mac Mac=Mac.getInstance(“HmacSHA256”)
SecretKeySpec SecretKeySpec=新SecretKeySpec(secretKey,“HmacSHA256”)
mac.init(secretKeySpec)
字节[]摘要=mac.doFinal(data.getBytes())
返回摘要
}捕获(InvalidKeyException e){
抛出新的RuntimeException(“转换为HMac SHA256时出现无效密钥异常”)
}
}
def hmac_sha256Hex(字节[]secretKey,字符串数据){
def结果=hmac_sha256(保密密钥,数据)
返回结果。encodeHex()
}
def getSignatureKey(密钥、日期戳、regionName、serviceName){
def kDate=hmac_sha256(('AWS4'+key).getBytes(),日期戳)
def kRegion=hmac_sha256(kDate,地区名称)
def kService=hmac_sha256(kRegion,serviceName)
def kSigning=hmac_sha256(kService,“aws4_请求”)
返回信号
}
def getHexDigest(文本){
def md=MessageDigest.getInstance(“SHA-256”)
md.update(text.getBytes())
返回md.digest().encodeHex()
}
def access_key='access key'
def secret_key='secret Access key'
def now=新日期()
def amzFormat=新的SimpleDataFormat(“yyyyMMdd'T'HHmmss'Z'”)
def stampFormat=新的简化格式(“yyyyMMdd”)
def amzDate=amzFormat.format(现在)
def dateStamp=stampFormat.format(现在)
def canonical_uri='/'
def canonical_querystring=请求_参数
def canonical_headers='host:'+host+'\n'+'x-amz-date:'+amzDate+'\n'
def signed_headers='主机;x-amz-date'
def payload_hash=getHexDigest(“”)
def canonical_request=method+'\n'+canonical_uri+'\n'+canonical_querystring+'\n'+canonical_headers+'\n'+signed_headers+'\n'+payload_散列
def算法='AWS4-HMAC-SHA256'
def credential_scope=日期戳+'/'+区域+'/'+服务+'/'+'aws4_请求'
def hash_canonical_请求=getHexDigest(canonical_请求)
def string_to_sign=算法+'\n'+amzDate+'\n'+凭证范围+'\n'+哈希\u规范\u请求
def signing_key=getSignatureKey(密钥、日期戳、区域、服务)
def signature=hmac_sha256Hex(签名密钥、字符串到签名)
def authorization_header=algorithm++'+'凭证='+access_key++'/'+Credential_scope++','+'SignedHeaders='+signed_headers++','+'签名='+Signature
def request_url=endpoint+'?'+canonical_querystring
def httpClient=新的httpClient()
def get=new GetMethod('https://xxxxx.execute-api.us-east-1.amazonaws.com/Method/id000/')
get.setRequestHeader(新头(“x-amz-date”,amzDate))
get.setRequestHeader(新头(“授权”,授权\头))
int statusCode=httpClient.executeMethod(get)
如果(状态代码>=200&&statusCode<300){
def slurper=new JsonSlurper()
def response=slurper.parseText(get.getResponseBodyAsString())
logger.debug响应
logger.debug响应?.Id
}否则{
logger.debug状态代码
}

谁能告诉我哪里出错了吗?

我已经解决了这个问题

我计算了与主机、服务、端点和请求参数相关的错误数量。描述每一个都很无聊,所以我只在下面添加正确的脚本

import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import java.security.InvalidKeyException
import java.security.MessageDigest

import org.apache.commons.httpclient.HttpClient
import org.apache.commons.httpclient.methods.GetMethod
import org.apache.commons.httpclient.Header
import groovy.json.JsonSlurper

import java.text.SimpleDateFormat

def access_key = "Access Key"
def secret_key = "Secret Access Key"
def method = "GET"
def service = "execute-api"
def host = "xxxxx.execute-api.us-east-1.amazonaws.com"
def region = "us-east-1"
def endpoint = "https://xxxxx.execute-api.us-east-1.amazonaws.com/Method/id000/"
def request_parameters = ""

def now = new Date()
def amzFormat = new SimpleDateFormat( "yyyyMMdd'T'HHmmss'Z'" )
def stampFormat = new SimpleDateFormat( "yyyyMMdd" )
def amzDate = amzFormat.format(now)
def dateStamp = stampFormat.format(now)

def canonical_uri = "/Method/id000/"
def canonical_headers = "host:" + host + "\n" + "x-amz-date:" + amzDate + "\n"
def signed_headers = "host;x-amz-date"

def payload_hash = getHexDigest("")
def canonical_request = method + "\n" + canonical_uri + "\n" + request_parameters + "\n" + canonical_headers + "\n" + signed_headers + "\n" + payload_hash

def algorithm = "AWS4-HMAC-SHA256"
def credential_scope = dateStamp + "/" + region + "/" + service + "/" + "aws4_request"
def hash_canonical_request = getHexDigest(canonical_request)
def string_to_sign = algorithm + "\n" +  amzDate + "\n" +  credential_scope + "\n" +  hash_canonical_request
def signing_key = getSignatureKey(secret_key, dateStamp, region, service)
def signature = hmac_sha256Hex(signing_key, string_to_sign)
def authorization_header = algorithm + " " + "Credential=" + access_key + "/" + credential_scope + ", " +  "SignedHeaders=" + signed_headers + ", " + "Signature=" + signature

def httpClient = new HttpClient()
def get = new GetMethod(endpoint)
get.setRequestHeader(new Header("Content-Type", "application/json"))
get.setRequestHeader(new Header("Host", host))
get.setRequestHeader(new Header("x-amz-date", amzDate))
get.setRequestHeader(new Header("Authorization", authorization_header))
def statusCode = httpClient.executeMethod(get)

if(statusCode >= 200 && statusCode < 300){ 
    def slurper = new JsonSlurper() 
    def response = slurper.parseText(get.getResponseBodyAsString()) 
    logger.debug response
}else{
    logger.debug statusCode
}
def hmac_sha256(secretKey, data) {
    Mac mac = Mac.getInstance("HmacSHA256")
    SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "HmacSHA256")
    mac.init(secretKeySpec)
    byte[] digest = mac.doFinal(data.getBytes())
    return digest
}
def hmac_sha256Hex(secretKey, data) {
    def result = hmac_sha256(secretKey, data)
    return result.encodeHex()
}
def getSignatureKey(key, dateStamp, regionName, serviceName){
    def kDate = hmac_sha256(("AWS4" + key).getBytes(), dateStamp)
    def kRegion = hmac_sha256(kDate, regionName)
    def kService = hmac_sha256(kRegion, serviceName)
    def kSigning = hmac_sha256(kService, "aws4_request")
    return kSigning
}
def getHexDigest(text){
    def md = MessageDigest.getInstance("SHA-256")
    md.update(text.getBytes())
    return md.digest().encodeHex()
}
导入javax.crypto.Mac
导入javax.crypto.spec.SecretKeySpec
导入java.security.InvalidKeyException
导入java.security.MessageDigest
导入org.apache.commons.httpclient.httpclient
导入org.apache.commons.httpclient.methods.GetMethod
导入org.apache.commons.httpclient.Header
导入groovy.json.JsonSlurper
导入java.text.simpleDataFormat
def access_key=“访问密钥”
def secret_key=“秘密访问密钥”
def method=“GET”
def service=“执行api”
def host=“xxxxx.execute api.us-east-1.amazonaws.com”
def region=“美国东部-1”
def端点=”https://xxxxx.execute-api.us-east-1.amazonaws.com/Method/id000/"
def请求_参数=“”
def now=新日期()
def amzFormat=新的SimpleDataFormat(“yyyyMMdd'T'HHmmss'Z'”)
def stampFormat=新的简化格式(“yyyyMMdd”)
def amzDate=amzFormat.format(现在)
def dateStamp=stampFormat.format(现在)
def canonical_uri=“/Method/id000/”
def canonical_headers=“主机:“+host+”\n“+”x-amz-date:“+amzDate+”\n”
def signed_headers=“主机;x-amz-date”
def payload_hash=getHexDigest(“”)
def canonical_request=方法+“\n”+规范化_uri+“\n”+请求参数+“\n”+规范化_头文件+“\n”+签名_头文件+“\n”+有效负载\u哈希
def算法=“AWS4-HMAC-SHA256”
def credential_scope=日期戳+“/”+地区+“/”+服务+“/”+“aws4_请求”
def hash_canonical_请求=getHexDigest(canonical_请求)
def string_to_sign=算法+“\n”+amzDate+“\n”+凭证作用域+“\n”+哈希规范请求
def signing_key=getSignatureKey(密钥、日期戳、区域、服务)
def signature=hmac_sha256Hex(签名密钥、字符串到签名)
def authorization_header=算法+“”+“Credential=“+access_key+”/“+Credential_scope+”,“+”SignedHeaders=“+signed_headers+”,“+”Signature=“+Signature
D