2010-09-20 2 views
8

SO Я тестирую реализацию OAuth для отдыха. Мой инструмент тестирования отправит HTTP-запрос, но мне нужно подготовить заголовок авторизации.Абсолютный минимальный код для получения действительной переменной oauth_signature, заполненной Java или Groovy?

Что мне нужно: Я хочу, чтобы действительный Authorization Заголовок

Что у меня есть: Все заголовки, кроме oauth_signature У меня также есть 2 секреты, в token_secret и consumer_secret. У меня также есть access_token. Так что это действительно сводится к тому, что нужно подписать этот запрос. Как мне это сделать?

Резюме: Мне просто нужно заполнить часть oauth_signature заголовка авторизации для службы RESTful. Как мне это сделать?

В основном:

oAuthHeader="OAuth"; 
oAuthHeader=oAuthHeader+" oauth_signature_method="+oauth_signature_method; 
oAuthHeader=oAuthHeader+",oauth_version="+oauth_version; 
oAuthHeader=oAuthHeader+",oauth_nonce="+oauth_nonce; 
oAuthHeader=oAuthHeader+",oauth_timestamp="+oauth_timestamp; 
oAuthHeader=oAuthHeader+",oauth_consumer_key="+oauth_consumer_key; 
oAuthHeader=oAuthHeader+",oauth_token="+oauth_token; 
oAuthHeader=oAuthHeader+",oauth_signature="+**oauth_signature**; 

Authorization = oAuthHeader; 

Моя проблема, я не имею oauth_signature часть. И я не знаю, как это получить. Помоги пожалуйста?

ответ

16

Вот мой код для Flickr OAuth. УВЕДОМЛЕНИЕ. Я ЗАПИСАЛ некоторую логику от SignPost. На самом деле очень сложно создать подпись ... ОК. Это всего лишь пример для генерации «oauth_signature»

package oauthflickr; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.UnsupportedEncodingException; 
import java.net.URI; 
import java.net.URISyntaxException; 
import java.net.URLEncoder; 
import java.security.InvalidKeyException; 
import java.security.NoSuchAlgorithmException; 
import java.util.ArrayList; 
import java.util.List; 

import javax.crypto.Mac; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.SecretKeySpec; 

import org.apache.commons.codec.binary.Base64; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.utils.URIUtils; 
import org.apache.http.client.utils.URLEncodedUtils; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 

/** 
* a simple program to get flickr token and token secret. 
* 
* @author Mark Zang 
* 
*/ 
public class OAuthForFlickr { 

    private static String key = "_________________________"; 
    private static String secret = "___________"; 

    private static final String HMAC_SHA1 = "HmacSHA1"; 

    private static final String ENC = "UTF-8"; 

    private static Base64 base64 = new Base64(); 

    /** 
    * 
    * @param url 
    *   the url for "request_token" URLEncoded. 
    * @param params 
    *   parameters string, URLEncoded. 
    * @return 
    * @throws UnsupportedEncodingException 
    * @throws NoSuchAlgorithmException 
    * @throws InvalidKeyException 
    */ 
    private static String getSignature(String url, String params) 
      throws UnsupportedEncodingException, NoSuchAlgorithmException, 
      InvalidKeyException { 
     /** 
     * base has three parts, they are connected by "&": 1) protocol 2) URL 
     * (need to be URLEncoded) 3) Parameter List (need to be URLEncoded). 
     */ 
     StringBuilder base = new StringBuilder(); 
     base.append("GET&"); 
     base.append(url); 
     base.append("&"); 
     base.append(params); 
     System.out.println("Stirng for oauth_signature generation:" + base); 
     // yea, don't ask me why, it is needed to append a "&" to the end of 
     // secret key. 
     byte[] keyBytes = (secret + "&").getBytes(ENC); 

     SecretKey key = new SecretKeySpec(keyBytes, HMAC_SHA1); 

     Mac mac = Mac.getInstance(HMAC_SHA1); 
     mac.init(key); 

     // encode it, base64 it, change it to string and return. 
     return new String(base64.encode(mac.doFinal(base.toString().getBytes(
       ENC))), ENC).trim(); 
    } 

    /** 
    * @param args 
    * @throws IOException 
    * @throws ClientProtocolException 
    * @throws URISyntaxException 
    * @throws NoSuchAlgorithmException 
    * @throws InvalidKeyException 
    */ 
    public static void main(String[] args) throws ClientProtocolException, 
      IOException, URISyntaxException, InvalidKeyException, 
      NoSuchAlgorithmException { 

     HttpClient httpclient = new DefaultHttpClient(); 
     List<NameValuePair> qparams = new ArrayList<NameValuePair>(); 
     // These params should ordered in key 
     qparams.add(new BasicNameValuePair("oauth_callback", "oob")); 
     qparams.add(new BasicNameValuePair("oauth_consumer_key", key)); 
     qparams.add(new BasicNameValuePair("oauth_nonce", "" 
       + (int) (Math.random() * 100000000))); 
     qparams.add(new BasicNameValuePair("oauth_signature_method", 
       "HMAC-SHA1")); 
     qparams.add(new BasicNameValuePair("oauth_timestamp", "" 
       + (System.currentTimeMillis()/1000))); 
     qparams.add(new BasicNameValuePair("oauth_version", "1.0")); 

     // generate the oauth_signature 
     String signature = getSignature(URLEncoder.encode(
       "http://www.flickr.com/services/oauth/request_token", ENC), 
       URLEncoder.encode(URLEncodedUtils.format(qparams, ENC), ENC)); 

     // add it to params list 
     qparams.add(new BasicNameValuePair("oauth_signature", signature)); 

     // generate URI which lead to access_token and token_secret. 
     URI uri = URIUtils.createURI("http", "www.flickr.com", -1, 
       "/services/oauth/request_token", 
       URLEncodedUtils.format(qparams, ENC), null); 

     System.out.println("Get Token and Token Secrect from:" 
       + uri.toString()); 

     HttpGet httpget = new HttpGet(uri); 
     // output the response content. 
     System.out.println("oken and Token Secrect:"); 

     HttpResponse response = httpclient.execute(httpget); 
     HttpEntity entity = response.getEntity(); 
     if (entity != null) { 
      InputStream instream = entity.getContent(); 
      int len; 
      byte[] tmp = new byte[2048]; 
      while ((len = instream.read(tmp)) != -1) { 
       System.out.println(new String(tmp, 0, len, ENC)); 
      } 
     } 
    } 

} 
+0

Это было моим спасением для двухдневной борьбы. Спасибо. –

+0

фантастический! помог мне –

+1

Когда-то сервер обрабатывает метод обратного вызова как дополнительный параметр и выдает ошибку несоответствия подписи. Удаление обратного вызова сработало для меня. Я тестировал плагин WordPress OAuth1.0a. – Prakashm88

Смежные вопросы