2012-04-15 9 views
0

Ich habe den letzten Tag gekämpft, um OAuth für meine Android-App implementiert zu bekommen. Ich habe ein Problem nach dem anderen bekommen. Ich möchte nur eine Anfrage unterschreiben, sie an einen Webservice senden und eine Antwort zurück erhalten (ich glaube, das ist der Ansatz mit zwei Beinen).Warum dieser Fehler: o'th.signpost.http.HttpParameters der Klasse konnte nicht gefunden werden

Ich habe Download Wegweiser:

-signpost-Core-1.2.1.2

-signpost-commonshttp4-1.2.1.2

Ich habe die Gläser zu meiner Bibliothek Build-Pfad hinzugefügt.

Gibt es irgendwo bestimmte ich muss diese JAR-Dateien in Reihenfolge für sie arbeiten?

Der Teil, mit dem ich am meisten Schwierigkeiten hatte, erzeugt eine Signatur und signiert die Anfrage schließlich. Es werden immer wieder Fehler für die HttpParemeters geworfen.

Gibt es eine Möglichkeit für mich, einen BaseString programmatisch zu generieren?

Kann jemand mich zu einem zweibeinigen Oauth android spezifisches Beispiel verweisen, das funktioniert?

Mein Code unten:

public void excecuteSigning(String targetURL){ 
     String SOAP_ACTION = "http://amebatv.com/api/authDevice"; 
     System.setProperty("http.keepAlive", "false");  
     HttpURLConnection _request = null; 
     DefaultHttpClient httpclient = null; 

    try{ 

     CONSUMER_SECRET = app_pref.getString("consumerSecret", ""); 
     CONSUMER_KEY = app_pref.getString("consumerKey", ""); 
     String oaut_token = app_pref.getString("accessToken", ""); 
     String tokenSecret = app_pref.getString("tokenSecret", ""); 
     String deviceId = deviceInfo.getSerial(); 


     CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer (CONSUMER_KEY,CONSUMER_SECRET); 
     consumer.setTokenWithSecret(oaut_token, tokenSecret); 

     //HttpRequest request; 
     HttpParameters requestParameters = new HttpParameters(); 
     requestParameters.put("file", "vacation.jpg"); 
     requestParameters.put(OAuth.OAUTH_CONSUMER_KEY, "dpf43f3p2l4k3l03"); 
     requestParameters.put(OAuth.OAUTH_NONCE, "kllo9940pd9333jh"); 
     requestParameters.put(OAuth.OAUTH_SIGNATURE_METHOD, "HMAC-SHA1"); 
     requestParameters.put(OAuth.OAUTH_TIMESTAMP, "1191242096"); 
     requestParameters.put(OAuth.OAUTH_TOKEN, "nnch734d00sl2jdk"); 
     requestParameters.put(OAuth.OAUTH_VERSION, "1.0"); 
     requestParameters.put("size", "original"); 


     HttpPost request = new HttpPost(targetURL); 
     SignatureBaseString baseString = new SignatureBaseString((HttpRequest) request, requestParameters); 

     String base = baseString.generate(); 
     System.out.println(":"+base); 

     System.out.println(computeHmac(base,"kd94hf93k423kf44&pfkkdhi9sl3r4s00")); 

     httpclient = new DefaultHttpClient(); 

     ContentProducer cp = new ContentProducer() { 
      public void writeTo(OutputStream outstream) throws IOException { 
       Writer writer = new OutputStreamWriter(outstream, "UTF-8"); 
       writeXml(writer); 
      } 
     }; 

     HttpParameters params = new HttpParameters(); 
     HttpEntity entity = new EntityTemplate(cp); 
     HttpPost request = new HttpPost(targetURL);   

     request.addHeader("Authorization",AUTH_HEADER); 
     request.addHeader("Content-Type", "text/xml; charset=utf-8"); 
     //request.addHeader("Content-Length",""+soapXML.getBytes().length); 
     request.addHeader("SOAPAction",SOAP_ACTION); 
     request.setEntity(entity); 

     // sign the request 
     consumer.sign(request); 
     // send the request 
     //request.connect(); 
     HttpResponse response = httpclient.execute(request); 

     //get response    
     //StringBuffer response = new StringBuffer(); 
     InputStream instream = null;  
     BufferedReader br = null;   
     try{    
      int respcode = response.getStatusLine().getStatusCode(); 
      Log.i("Server Response", ""+respcode); 

      //get XML from InputStream 
      if(respcode>= 200){ 
       instream = response.getEntity().getContent();     
       client.buildDoc(instream);  
      } 
      else{ 
       Log.i("Server Response", ""+respcode); 
       //instream = request.getErrorStream(); 
       } 

     }catch(Exception e){ 
      Log.i("SPLASH","Unable to create connection stream"); 
      e.printStackTrace(); 
     } 
     finally {  
      if(instream != null) { 
      Log.i("SPLASH","Disconnecting stream"); 
      instream.close(); 
      } 
     } 
      */ 
    } 
    catch(Exception e){ 
     Log.i("SPLASH","Unable to create connection"); 
     e.printStackTrace(); 
    }finally {  
      if(httpclient != null) { 
      Log.i("SPLASH","Disconnecting"); 
      httpclient.getConnectionManager().shutdown(); 
      } 
    } 
} 

/* 
* Method:computeHmac() 
* @params: String, String 
* return: String 
*/ 
public String computeHmac(String baseString, String key) 
           throws NoSuchAlgorithmException, 
           InvalidKeyException, 
           IllegalStateException, 
           UnsupportedEncodingException 
    { 

     Mac mac = Mac.getInstance("HmacSHA1"); 
     SecretKeySpec secret = new SecretKeySpec(key.getBytes(), mac.getAlgorithm()); 
     mac.init(secret); 
     byte[] digest = mac.doFinal(baseString.getBytes()); 
     return Base64.encodeToString(digest,Base64.URL_SAFE); 
    } 

Antwort

1

Bibliotheken im libs Ordner sein müssen, dann werden sie auf den Build-Pfad des Projekts automatisch hinzugefügt (mit s!).

+0

Entschuldigung, was meinst du (mit einem s!)? – Fabii

+0

Erstelle ich einen libs-Ordner, ich sehe keinen in meiner Paket-Explorer-Hierarchie. – Fabii

+0

Ja, erstelle einen libs-Ordner in deinem Android-Projekt (stelle sicher, dass die neueste Version des ADT-Plugins in Eclipse installiert ist) –

1

Ich habe nie Schild benutzt, damit ich dir helfen kann nicht. Ich kann nur einen Code teilen, an dem ich gearbeitet habe, um OAUTH-Tanz zu machen. Ich benutze Schreiber, und es funktioniert gut sowohl mit 1.0 und 2.0 oauth specs. Meine Webservices erfordern eine Authentifizierung über einen Webbrowser, die mit Webview funktioniert. Unter Code wird wahrscheinlich nicht kompilieren, aber es kommt von einer funktionierenden (aber noch in Entwicklung befindlichen) Anwendung. Da ich noch Android lerne sind alle Kommentare und Korrekturen willkommen.

Der gesamte Prozess wird von der Aktivität gestartet, die ich für die Kommunikation mit dem Webservice verwende, er enthält nur die ursprünglich verborgene Webansicht. Init-Methode ist, wo alles beginnt:

import java.net.HttpURLConnection; 
    import java.net.MalformedURLException; 
    import java.net.URL; 

    import org.scribe.builder.ServiceBuilder; 
    import org.scribe.builder.api.DefaultApi10a; 
    import org.scribe.model.OAuthRequest; 
    import org.scribe.model.Response; 
    import org.scribe.model.Token; 
    import org.scribe.model.Verb; 
    import org.scribe.model.Verifier; 
    import org.scribe.oauth.OAuthService; 

    import android.app.Activity; 
    import android.content.Intent; 
    import android.net.Uri; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.os.Handler; 
    import android.os.Message; 
    import android.util.Log; 
    import android.view.View; 
    import android.webkit.WebView; 
    import android.webkit.WebViewClient; 

    public class FCEHttpHelper { 
     public static final String LOG_TAG = FCEHttpHelper.class.getSimpleName(); 

     //api_key/oauth_key 
     //string that is given to you by webservice provider to uniquely identify your app 
     final static String APIKEY = "xxxxxx"; 

     //oauth_secret 
     //also given to you by service provider 
     final static String APISECRET = "yyyyyyy"; 

     //callback sent to webview after authorization 
     //some services allow you to set it up manually, ie. Quizlet 
     final static String CALLBACK = "oauth://flashcardexchange"; 

     //scribe classes 
     Token token; 
     OAuthService serviceBuilder; 

     static class GetUrl extends AsyncTask<String, Integer, String> { 
      public Token t; 
      public OAuthService serviceBuilder; 
      public Activity act; 
      public Handler handler; 

      protected String doInBackground(String... urls) {   
       String resp = ""; 

       if (t != null) { 
        OAuthRequest req = new OAuthRequest(Verb.GET, urls[0]); 
        serviceBuilder.signRequest(t, req); 
        Response response = req.send(); 
        resp = response.getBody(); 
       } 
       else { 
        URL url = null; 
        try { 
         url = new URL(urls[0]); 
        } catch (MalformedURLException e) { 
         Log.d(LOG_TAG, e.getMessage()); 
        } 

        HttpURLConnection urlConnect = null; 
        try { 
         urlConnect = (HttpURLConnection) url.openConnection(); 
         resp = StringUtils.convertStreamToString(urlConnect 
           .getInputStream()); 

        } catch (Exception e) { 
         Log.d("RESP", "URL ex", e); 
        } finally { 
         if (urlConnect != null) 
          urlConnect.disconnect(); 
        } 
       } 
       return resp; 
      } 

      protected void onProgressUpdate(Integer... progress) { 
      } 

      protected void onPostExecute(String result) { 
       //Log.i(LOG_TAG, result); 
       Intent data = new Intent(); 
       Bundle extras = new Bundle(); 
       extras.putString("RESULT", result); 
       data.putExtras(extras); 
       act.setResult(Activity.RESULT_OK, data); 
       act.finish(); 
      } 
     } 

     @Override 
     public void Destroy() { 
     } 

     @Override 
     public void Init(final Activity act, final WebView webView, boolean oauthRequired, final Handler handler) { 
      Intent intent = act.getIntent(); 
      final String surl = intent.getStringExtra(INTENT_URL); 

      if (!oauthRequired) { 
       GetUrl gurl = new GetUrl(); 
       gurl.t = null; 
       gurl.serviceBuilder = null; 
       gurl.act = act; 
       gurl.handler = handler; 
       gurl.execute(surl);   
       return; 
      } 

      // get saved token from database, if it does not exists then web authentication is required 

      // set up service and get request token as seen on scribe website 
      // https://github.com/fernandezpablo85/scribe-java/wiki/Getting-Started 
      serviceBuilder = new ServiceBuilder() 
        .provider(new DefaultApi10a() { 

       /// example is for flashcardexchange oauth 

         @Override 
         public String getRequestTokenEndpoint() { 
          return "https://secure.flashcardexchange.com/oauth_request_token"; 
         } 

         @Override 
         public String getAccessTokenEndpoint() { 
          return "https://secure.flashcardexchange.com/oauth_access_token"; 
         } 

         @Override 
         public String getAuthorizationUrl(
           org.scribe.model.Token requestToken) { 
          return "https://secure.flashcardexchange.com/oauth_login" 
            + "?oauth_token=" + requestToken.getToken(); 
         } 
        }).apiKey(APIKEY).apiSecret(APISECRET).callback(CALLBACK) 
        .debug() 
        .build(); 

      if (token == null) { 

       Message msg = new Message(); 
       msg.what=1; 
       handler.sendMessage(msg); 

       webView.setVisibility(View.VISIBLE); 

       final Token requestToken = serviceBuilder.getRequestToken(); 
       final String authURL = serviceBuilder 
         .getAuthorizationUrl(requestToken); 

       // attach WebViewClient to intercept the callback url 
       webView.setWebViewClient(new WebViewClient() { 

        @Override 
        public boolean shouldOverrideUrlLoading(WebView view, String url) { 

         // check for our custom callback protocol 
         // otherwise use default behavior 
         if (url.startsWith("oauth")) { 
          // authorization complete hide webview for now. 
          webView.setVisibility(View.GONE); 

          Uri uri = Uri.parse(url); 
          String verifier = uri 
            .getQueryParameter("oauth_verifier"); 
          Verifier v = new Verifier(verifier); 

          // save this token for practical use. 
          Token accessToken = serviceBuilder.getAccessToken(
            requestToken, v); 

          // host oauth detected from callback 
          // oauth://flashcardexchange 
          if (uri.getHost().equals("flashcardexchange")) { 

           // save accessToken to database to use it later 

           webView.setVisibility(View.GONE); 

           Message msg = new Message(); 
           msg.what=2; 
           handler.sendMessage(msg); 

           GetUrl gurl = new GetUrl(); 
           gurl.t = accessToken; 
           gurl.act = act; 
           gurl.handler = handler; 
           gurl.serviceBuilder = serviceBuilder; 
           gurl.execute(surl);       
          } 

          return true; 
         } 

         return super.shouldOverrideUrlLoading(view, url); 
        } 
       }); 

       // send user to authentication page 
       webView.loadUrl(authURL); 
      } else { 
       webView.setVisibility(View.GONE); 

       GetUrl gurl = new GetUrl(); 
       gurl.t = token; 
       gurl.serviceBuilder = serviceBuilder; 
       gurl.act = act; 
       gurl.handler = handler; 
       gurl.execute(surl); 
      }  
     } 
    } 
+0

danke, aber ich muss Wegweiser verwenden. – Fabii