Что я делаю неправильно, когда я пытаюсь получить подпись OAuth? - PullRequest
0 голосов
/ 03 апреля 2019

Я пробовал несколько итераций построителя подписи oauth 1.0. Ни один из них, кажется, не работает. Я предоставляю код, чтобы увидеть, если кто-то может посмотри, куда я сбиваюсь.

Посмотрел все, включая переполнение стека, чтобы помочь с этим, и я перепробовал несколько предложений. Я пытался использовать HTTPRequest как POSTMAN делает:

 public String GetRequest(String Data) throws IOException {
   OkHttpClient client = new OkHttpClient();
   Request request = new Request.Builder()
     .url(url1)
     .get()
     .addHeader("Content-Type", "application/json")
     .addHeader("Authorization", Data)
     .addHeader("cache-control", "no-cache")
     .build();

   Response response = client.newCall(request).execute();
   return response.body().string();
   } 

и я получаю рукопожатие. Я попытался HttpUrlConnection в сочетании с обеими попытками на Подпись OAuth ниже:

    url = new URL(url1);
    HttpURLConnection connn = (HttpURLConnection) url.openConnection();
    connn.setRequestProperty("Authorization", token);
    connn.setRequestProperty("Content-Type", "application/json");
    connn.setRequestProperty("cache-control", "no-cache");
    connn.setDoOutput(true);
    connn.setRequestMethod("GET");
    connn.connect();
    int responseCode = connn.getResponseCode();

Я пробовал каждый с одинаковым результатом - ошибка «403». Я сравнил свою строку подписи с POSTMAN, используя тот же NONCE и метка времени и моя строка подписи всегда разные. не должны это будет то же самое? Похоже, что я не делаю что-то в том же заказать (??) как POSTMAN, когда я создаю свою подпись. Мне дали все четыре жетона заранее, и мне сказали что они не истекают.

  public static String oauth_consumer_key = "AAAAAAA";  
  public static String oauth_consumer_secret = "BBBBBBBB";
  public static String oauth_request_token = "CCCCCCC"; 
  public static String oauth_request_token_secret = "DDDDD";

  public URL url = null;
  url1 = "https://my url.com/myapi"
  public static String ENC = "UTF-8";

Начало строки Token:

  String token = "\"" + "OAuth oauth_consumer_key=" + consumerKeyStr + 
  "," + "oauth_token=" + accessTokenStr + "," + "oauth_signature_method=" 
  + signatureMethod + "," + "oauth_timestamp=" + "\"" + TimeStamp + "\""
  + "," + "oauth_nonce=" + "\"" + XXDLIX + "\"" + "," + "oauth_version="
  + sendVersion + "," + "oauth_signature=";

Я попытался создать базовый параметр:

  String token3 = "oauth_consumer_key=" + oauth_consumer_key + "," + 
  "&oauth_nonce=" + XXDLIX.trim() + ","  + "&oauth_signature_method=" + 
   signatureMethod + "," + "&oauth_timestamp=" + TimeStamp + ","  
   + "&oauth_token=" + oauth_request_token + "," + "&oauth_version=" + 
   Oauth_Version; 

Построение ключевой строки (не совсем уверен, правильно ли это или если я нужны оба ключа для этого. В моем исследовании было указание, что я сделал, так попробовал):

   keyString = consumerSecretStr + "&" + accessSecretStr + "&";
   keyString = URLEncoder.encode(keyString.trim(), ENC);

и использование:

   url2 = URLEncoder.encode(url1.trim(), ENC);
   oauth_signature = "";
   oauth_signature = getSignature(url2, token3);
   oauth_signature = URLEncoder.encode(oauth_signature.trim(), ENC);

   public static String getSignature(String url, String params)
         throws UnsupportedEncodingException, NoSuchAlgorithmException,
         InvalidKeyException {

      StringBuilder base = new StringBuilder();
      base.append("GET&");
      base.append(url);
      base.append("&");
      base.append(params);

      byte[] keyBytes = (keyString.getBytes(ENC));

      SecretKey key = new SecretKeySpec(keyBytes, "HmacSHA1");

      Mac mac = Mac.getInstance("HmacSHA1");
      mac.init(key);

      return new String(Base64.getEncoder().encode
                    (mac.doFinal(base.toString().getBytes(
                    ENC))), ENC).trim();
   } 

См. Строку Token выше:

       String token = token + "\"" + oauth_signature + "\"" + "\"";

Наконец, я попытался создать подпись OAuth:

     ArrayList<String> params = new ArrayList<String>();
        params.add("oauth_consumer_key=" + oauth_consumer_key);
        params.add("oauth_token=" + oauth_request_token);
        params.add("oauth_signature_method=" + signatureMethod);
        params.add("oauth_timestamp=" + TimeStamp);
        params.add("oauth_nonce=" + XXDLIX.trim());
        params.add("oauth_version=" + Oauth_Version);
        Collections.sort(params); 
        //I was told they had to be in Alphabetical Order
       StringBuffer parametersList = new StringBuffer();
   for ( int i = 0; i < params.size(); i++ ){
       parametersList.append( ( ( i > 0 ) ? "&" : "" ) + params.get( i ));
   }
       String token2 = URLEncoder.encode(parametersList.toString(), ENC);
   String signatureString = GetMethod + "&" + 
          URLEncoder.encode(("https://my url" + "&"), ENC) + 
          (URLEncoder.encode(parametersList.toString(), ENC));

       String signature = null;
       try{
      SecretKeySpec signingKey = new SecretKeySpec( 
                      (keyString.getBytes()), "HmacSHA1" );
       Mac mac = Mac.getInstance( "HmacSHA1" );
       mac.init( signingKey );
       byte[] rawHMAC = mac.doFinal( signatureString.getBytes() );
       signature = Base64.getEncoder().encodeToString(rawHMAC);
       }
       catch ( Exception e )
       {
       System.err.println( "Unable to append signature" );
           System.exit( 0 );
       {

См. Строку токена выше:

      String token = token + "\"" + signature + "\"";

открытый класс POBWSPOST2 {

public void POSTRequest2(String Data) throws IOException {

    XXDLIX = Data.trim();
    boolean sendMagento = false;
    String inline = null;
    TimeStamp = ""; 
    TimeStamp = getTimestamp();
    url1 = "https://myURL.com/GetAPI:
    String param = "?Authorization=" + oauth_request_token;

    keyString = consumerSecretStr + "&" + accessSecretStr + "&";
    keyString = URLEncoder.encode(keyString.trim(), ENC);

    String jsontext = json_object.toString();
        try
        {
            String token = "\"" + "OAuth oauth_consumer_key=" + consumerKeyStr + "," 
                   + "oauth_token=" + accessTokenStr + "," + "oauth_signature_method=" + signatureMethod  
                   + "," + "oauth_timestamp=" + "\"" + TimeStamp + "\"" + "," + "oauth_nonce="
                   + "\"" + XXDLIX + "\"" + "," + "oauth_version=" + sendVersion + "," + "oauth_signature=";

            String token4 = "\"" + "OAuth realm ="  + "\"" + url1 +  "\"" + "," 
                    + "oauth_consumer_key=" + consumerKeyStr + "," 
                    + "oauth_token=" + accessTokenStr + "," + "oauth_signature_method=" + signatureMethod  
                    + "," + "oauth_timestamp=" + "\"" + TimeStamp + "\"" + "," + "oauth_nonce="
                    + "\"" + XXDLIX + "\"" + "," + "oauth_version=" + sendVersion + "," + "oauth_signature=";

            ArrayList<String> params = new ArrayList<String>();
            params.add("oauth_consumer_key=" + oauth_consumer_key);
            params.add("oauth_token=" + oauth_request_token);
            params.add("oauth_signature_method=" + signatureMethod);
            params.add("oauth_timestamp=" + TimeStamp);
            params.add("oauth_nonce=" + XXDLIX.trim());
            params.add("oauth_version=" + Oauth_Version);
            Collections.sort(params);
            StringBuffer parametersList = new StringBuffer();
            for ( int i = 0; i < params.size(); i++ )
            {
                parametersList.append( ( ( i > 0 ) ? "&" : "" ) + params.get( i ) );
            }
            String token2 = URLEncoder.encode(parametersList.toString(), ENC);
            String signatureString = 
                  GetMethod + "&" + URLEncoder.encode(("https://myUrl.com/myAPI + "&"), ENC) + (URLEncoder.encode(parametersList.toString(), ENC));

                String signature = null;

                try
                {
                  SecretKeySpec signingKey = new SecretKeySpec( 
                    (keyString.getBytes()), "HmacSHA1" );
                  Mac mac = Mac.getInstance( "HmacSHA1" );
                  mac.init( signingKey );
                  byte[] rawHMAC = mac.doFinal( signatureString.getBytes() );
                  signature = Base64.getEncoder().encodeToString(rawHMAC);
                }
                catch ( Exception e )
                {
                  System.err.println( "Unable to append signature" );
                  System.exit( 0 );
                }

                String token3 = "oauth_consumer_key=" + oauth_consumer_key + "," + "&oauth_nonce=" + XXDLIX.trim() + ","
                        + "&oauth_signature_method=" + signatureMethod + "," + "&oauth_timestamp=" + TimeStamp + ","  
                        + "&oauth_token=" + oauth_request_token + "," + "&oauth_version=" + Oauth_Version;    

            try{
                url2 = URLEncoder.encode(url1.trim(), ENC);
                signature = URLEncoder.encode(signature.trim(), ENC);
                oauth_signature = "";
                oauth_signature = getSignature(url2, token3);

                oauth_signature = URLEncoder.encode(oauth_signature.trim(), ENC);
                token = token + "\"" + signature + "\"";
                String token6 = token + "\"" + oauth_signature + "\"" + "\"";
                //token = token + "\"" + URLEncoder.encode(oauth_signature, ENC) + "\"" + "\"";
                url = new URL(url1);
                //token = token + OAuthsignature;
                //String responsive = GetRequest(token);
                //String responsive1 = GetRequest(token6);
            } catch (InvalidKeyException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            HttpURLConnection connn = (HttpURLConnection) url.openConnection();

            connn.setReadTimeout(10000);
            connn.setConnectTimeout(15000);
            connn.setRequestProperty("Authorization", token);
            connn.setRequestProperty("Content-Type", "application/json");
            connn.setRequestProperty("cache-control", "no-cache");
            connn.setDoOutput(true);
            connn.setRequestMethod("GET");

            connn.connect();
            int responseCode = connn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_CREATED) { //success
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        connn.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                } in .close();
                // print result
                System.out.println(response.toString());
                sendMagento = true;
            } else {
                System.out.println("POST DID NOT WORK");
            }
            if(connn != null){
                connn.disconnect();
            }

        }
        catch (MalformedURLException e4)
        {
            e4.printStackTrace();
            sendMagento = false;
        } 
        catch (IOException e5)
        {
            e5.printStackTrace();
            sendMagento = false;
        }
}

public static String getSignature(String url, String params)
        throws UnsupportedEncodingException, NoSuchAlgorithmException,
        InvalidKeyException {

    StringBuilder base = new StringBuilder();
    base.append("GET&");
    base.append(url);
    base.append("&");
    base.append(params);

    byte[] keyBytes = (keyString.getBytes(ENC));

    SecretKey key = new SecretKeySpec(keyBytes, "HmacSHA1");

    Mac mac = Mac.getInstance("HmacSHA1");
    mac.init(key);

    return new String(Base64.getEncoder().encode(mac.doFinal(base.toString().getBytes(
           ENC))), ENC).trim();
}
...