Вызов шлюза API AWS с использованием access и секретных ключей в Java

#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. Спасибо, позвольте мне взглянуть на документы. Да, я использую профили, привел это здесь просто для ясности.