#java #amazon-web-services #api #aws-api-gateway
#java #amazon-веб-сервисы #API #aws-api-gateway
Вопрос:
Я пытаюсь вызвать конечную точку шлюза AWS API с доступом и секретным ключом с использованием Java. Он отлично работает с использованием Postman. Ниже приведены мои входные данные Postman.
GET
Url - https://example.com/testing
Authorization:
Type - AWS Signature
AccessKey - xxxxxxxxxxxx
SecretKey - yyyyyyyyyyyy
AWS Region - us-east-1
Service Name - execute-api
При вызове с использованием Java и сбой с сообщением о недопустимой ошибке. Не уверен, в чем проблема. Я знаю, что это связано с авторизацией. Я просмотрел документацию AWS, но это неясно. Ценю вашу помощь здесь.
Вот код.
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.List;
import java.net.*;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
public class InvokeApi {
static byte[] HmacSHA256(String data, byte[] key) throws Exception {
String algorithm = "HmacSHA256";
Mac mac = Mac.getInstance(algorithm);
mac.init(new SecretKeySpec(key, algorithm));
return mac.doFinal(data.getBytes("UTF-8"));
}
static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName)
throws Exception {
byte[] kSecret = ("AWS4" key).getBytes("UTF-8");
byte[] kDate = HmacSHA256(dateStamp, kSecret);
byte[] kRegion = HmacSHA256(regionName, kDate);
byte[] kService = HmacSHA256(serviceName, kRegion);
byte[] kSigning = HmacSHA256("aws4_request", kService);
return kSigning;
}
public static void main(String[] args) {
String newurl = "https://example.com/testing";
String key = "yyyyyyyyyyyy";
String dateStamp = "2020-11-04 12:28:12 00:00";
String regionName = "us-east-1";
String serviceName = "execute-api";
String awsAccessKeyID = "xxxxxxxxxxxx";
String completeResponse = "";
URL url;
try {
url = new URL(newurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "*/*");
byte getSignatureKey[] = getSignatureKey(key, dateStamp, regionName, serviceName);
conn.setRequestProperty("Authorization", "AWS " awsAccessKeyID ":" getSignatureKey);
if (conn.getResponseCode() == 200) {
InputStreamReader inputStream = new InputStreamReader(conn.getInputStream());
BufferedReader br = new BufferedReader(inputStream);
String output;
while ((output = br.readLine()) != null) {
completeResponse = output;
}
System.out.println("completeResponse :" completeResponse);
br.close();
inputStream.close();
if (conn != null) {
conn.disconnect();
}
} else {
System.out.println("Eror code : " conn.getResponseMessage());
}
} catch (MalformedURLException e) {
e.printStackTrace();
System.out.println("Exception 1 : " e);
} catch (IOException e) {
e.printStackTrace();
System.out.println("Exception 2 : " e);
} catch (Exception e) {
e.printStackTrace();
System.out.println("Exception 3 : " e);
}
}
}
Комментарии:
1. почему бы просто не использовать aws sdk?
2. Я пробовал это изначально, но безуспешно. Если есть хороший пример, я был бы признателен.
3. документы aws довольно хороши. docs.aws.amazon.com/apigateway/latest/developerguide /…
4. также размещение секретов в исходном коде является ОЧЕНЬ плохой практикой. вы должны использовать интерфейс командной строки aws и профили настройки.
5. Спасибо, позвольте мне взглянуть на документы. Да, я использую профили, привел это здесь просто для ясности.