Как обновить статус Twitter с помощью аутентификации Oauth в ядре Java - PullRequest
0 голосов
/ 11 октября 2018

Я получаю код ответа HTTP 400, код ошибки 215, «Плохие данные аутентификации» при попытке опубликовать обновление Twitter.Из приложения разработчика Twitter у меня есть oauth_consumer_key & oauth_token вместе с oauth_consumer_secret & oauth_token_secret для учетной записи Twitter.

public void doPOSTTweet() throws IOException {      

    // Build Signature base string

    String message = "Hey Ladies and Gentlemen a signed OAuth request";
    int timeint     = (int) (System.currentTimeMillis() / 1000);
    String oauth_timestamp = Integer.toString(timeint);
    int nonce   = (int) (Math.random() * 100000000);
    String oauth_nonce  = Integer.toString(nonce);

    String url = POST_TWITTER_URL;

    // Parameters
    String params = "include_entities=true&oauth_consumer_key="+oauth_consumer_key
        +"&oauth_nonce="+oauth_nonce+"&oauth_signature_method=HMAC-SHA1&oauth_timestamp="+oauth_timestamp
        +"&oauth_token="+oauth_token+"&oauth_version=1.0&status="+encodeURIComponent(message);

    String signature_base_string = "POST" + "&" + encodeURIComponent(url) + "&" + encodeURIComponent(params);

    // Getting a signing key
    String oauth_signature  = generateSignature(signature_base_string, oauth_consumer_secret, oauth_token_secret);

    URL obj = new URL(url);

    HttpsURLConnection conn = (HttpsURLConnection) obj.openConnection();
    conn.setRequestMethod("POST");
    conn.setRequestProperty("User-Agent", USER_AGENT);

    // set POST headers
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    conn.setRequestProperty("Authorization", "OAuth oauth_consumer_key=\""+oauth_consumer_key
            +"\", oauth_nonce=\""+oauth_nonce
            +"\", oauth_signature=\""+oauth_signature
            +"\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\""+oauth_timestamp
            +"\", oauth_token=\""+oauth_token+"\", oauth_version=\"1.0\"");

    // POST output      
    conn.setDoOutput(true);
    OutputStream os = conn.getOutputStream();
    os.write(params.getBytes());
    os.flush();
    os.close();

    int responseCode = conn.getResponseCode();
    System.out.println("Twitter POST Response Code :: " + responseCode);

// ....

}

oauth_signature создается с помощью следующих функций:

public String generateSignature(String signatureBaseStr, String oAuthConsumerSecret, String oAuthTokenSecret) {  
    byte[] byteHMAC = null;  
    try {  
      Mac mac = Mac.getInstance("HmacSHA1");  
      SecretKeySpec spec;  
      if (null == oAuthTokenSecret) {  
        String signingKey = encodeURIComponent(oAuthConsumerSecret) + '&';  
        spec = new SecretKeySpec(signingKey.getBytes(), "HmacSHA1");  
      } else {  
        String signingKey = encodeURIComponent(oAuthConsumerSecret) + '&' + encodeURIComponent(oAuthTokenSecret);  
        spec = new SecretKeySpec(signingKey.getBytes(), "HmacSHA1");  
          }  
          mac.init(spec);  
          byteHMAC = mac.doFinal(signatureBaseStr.getBytes());  
        } catch (Exception e) {  
          e.printStackTrace();  
        }  
        return Base64.encode(byteHMAC.toString());  
}  

public static String encodeURIComponent(String s) {
    String result;

    try {
        result = URLEncoder.encode(s, "UTF-8")
                .replaceAll("\\+", "%20")
                .replaceAll("\\&", "%26");
    } catch (UnsupportedEncodingException e) {
        result = s;
    }

    return result;
}

Строка параметра:

include_entities=true&oauth_consumer_key=xxPPDD9m81ZIVbM5my5mc5Vgw
&oauth_nonce=49123012&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1539221210
&oauth_token=0000000619224240130-2ZZZjFqaSddjixLbBcPfYdbniQLMXX&oauth_version=1.0
&status=Hey%20Ladies%20and%20Gentlemen%20a%20signed%20OAuth%20request

Строка signature_base_string:

POST&https%3A%2F%2Fapi.twitter.com%2F1.1%2Fstatuses%2Fupdate.json
&include_entities%3Dtrue%26oauth_consumer_key%3DxxPPDD9m81ZIVbM5my5mc5Vgw
%26oauth_nonce%3D49123012
%26oauth_signature_method%3DHMAC-SHA1
%26oauth_timestamp%3D1539221210%26oauth_token%3D0000000619224240130-2ZZZjFqaSddjixLbBcPfYdbniQLMXX%26oauth_version%3D1.0
%26status%3DHey%2520Ladies%2520and%2520Gentlemen%2520a%2520signed
%2520OAuth%2520request

oauth_signature: W0JAMTBkZDcwMTg=

Когда сообщение отправлено, код ответа HTTP 400 с ответом JSON:

{
    "errors": [
        {
            "code": 215,
        "message": "Bad Authentication data."
        }
    ]
}

Я вручную воссоздал этот пост с почтальоном, введя ту же информацию:

Twitter Post

Сообщение об ошибке то же самое от почтальона.Я подтвердил ключи oauth на странице приложения Twitter, и все идентично.Есть идеи по устранению неполадок?Существует ли правильный синтаксис и / или порядок, который отсутствует?

...