Двуногий Пример OAuth2 в Java? - PullRequest
1 голос
/ 28 апреля 2011

У меня есть пример приложения web.py , предоставляющего REST-сервисы + OAuth2. В Python клиентское приложение проходит процесс генерации потребителя OAuth2, запроса, подписания его и т. Д. Примерно так (ссылка псевдокода, не завершена):

import json
import time
import oauth2
import urllib2

# Set up the POST variables
method = 'POST'
url = 'https://localhost/service/rest'
parameters = {
  'username' : username,
  'password' : password
}

# Generate our Consumer object
consumer = oauth2.Consumer( key = KEY, secret = SECRET )

# Add additional parameters required by OAuth
parameters['oauth_version']      = "1.0"
parameters['oauth_nonce']        = oauth2.generate_nonce()
parameters['oauth_timestamp']    = int(time.time())
parameters['oauth_consumer_key'] = consumer.key

# Generate and sign the request
oauth = oauth2.Request( method = method, url = url, parameters = parameters )
signature_method = oauth2.SignatureMethod_HMAC_SHA1()
oauth.sign_request( signature_method, consumer, None )

# Shoot it off to the webserver
req = urllib2.Request( BASE_URL, oauth.to_postdata() )
result = urllib2.urlopen( req ).read()
json_result = json.loads( result )
print json_result

TADA! Это работает как чемпион. Я пытаюсь сделать то же самое под Java, особенно на Android, но сейчас я все сделаю. Все примеры, которые я видел, сосредоточены на общедоступных API-интерфейсах OAuth2, использующих трехстороннюю аутентификацию, или на серверных конфигурациях для веб-служб.

Может ли кто-нибудь сжалиться над мной и указать на такой же простой пример на Java с использованием BasicHttpContext, DefaultHttpClient и друзей?

ИЗМЕНЕННОЕ ПОЗЖЕ

Вероятно, считается плохой формой отвечать на ваши собственные вопросы, но вот как сделать то, что я просил. Оказывается, что двуногий oauth - это действительно функциональность OAuth v1.0, так что полузаброшенная библиотека oauth.signpost может сделать это легко. Я попытался использовать более позднюю поддерживаемую библиотеку joauth, но не смог найти хороших примеров того, как делать только те части, которые я хотел. Этот код фактически разбросан по трем или четырем различным java-файлам в моем коде, но я сделал все это вместе для этого примера псевдокода.

import ...
import oauth.signpost.OAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;

public class RestClient {

  private OAuthConsumer oauth_consumer = null;
  private DefaultHttpClient http_client;
  private static final String consumer_key    = "something";
  private static final String consumer_secret = "something_else";

  public RestClient( Context context ) {
    // Instantiate our custom http client with our trusted key
    this.http_client = new DefaultHttpClient();
    // Instantiate an oauth_consumer
    this.oauth_consumer = new CommonsHttpOAuthConsumer( consumer_key, consumer_secret );
  }

  public POST( String url, Map params ) {
    // Initialize our post request
    HttpPost httppost = new HttpPost( url );
    httppost.setHeader("Accept", "application/json");
    httppost.setHeader("Content-type", "application/x-www-form-urlencoded");

    // This iterates through the parameters and stores them for use
    List<NameValuePair> name_value_pairs = new ArrayList<NameValuePair>(2);
    Iterator iter = params.entrySet().iterator();
    while ( iter.hasNext() ) {
      Map.Entry pairs = (Map.Entry)iter.next();
      name_value_pairs.add(
        new BasicNameValuePair( (String)pairs.getKey(),   (String)pairs.getValue() )
      );
    }

    try {
      // Put our parameters in our Post
      httppost.setEntity( new UrlEncodedFormEntity( name_value_pairs ) );
      // sign our request
      this.oauth_consumer.sign( httppost );
      // Yoiks, and away!
      HttpResponse response = http_client.execute( httppost );
      HttpEntity entity = response.getEntity();

      if (entity != null) {
        InputStream instream = entity.getContent();
        JSONObject json = new JSONObject( convertStreamToString(instream) );
        // Closing the input stream will trigger connection release
        instream.close();
        return json;
      } catch ( aBunchOfShit e) {
        e.printStackTrace();
      }
    }
    return null;
  }
}

Когда вы проверяете свою подпись на бэкэнде, обязательно включайте все параметры, которые вы передали в запросе. Я сидел и смотрел на ошибку «Недопустимая подпись. Ожидаемая строка подписи POST & ...» в течение часа, пока не понял, как установить System.setProperty («debug», «1»); и увидел оригинальную базовую строку на стороне Java. Пока это работает достаточно хорошо, но я все же хотел бы посмотреть, как это работает в поддерживаемой библиотеке.

1 Ответ

1 голос
/ 15 июня 2011

Поскольку вы упомянули о joauth, я написал документацию , чтобы разрешить авторизацию OAuth 1 с использованием JOAuth.

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...