2012-04-15 71 views
0

我一直在挣扎着过去的一天,为我的android应用程序实现OAuth。问题后我遇到了问题。我只想签署请求,将其发送到Web服务并获得回复(我相信这是两条腿的方法)。为什么这个错误:找不到类'oauth.signpost.http.HttpParameters

我已经下载路标:

-signpost核-1.2.1.2

,commonshttp4-1.2.1.2 -signpost

我已经添加了罐子到我的媒体库的构建路径。

是否有某处需要放置这些jar文件才能使它们工作?

我一直遇到麻烦最多的部分是生成签名并最终签署请求。错误一直在为HttpParemeters引发。

有没有办法让我以编程方式生成一个baseString?

有人可以指导我一个双腿Oauth android的具体例子,工程?

我下面的代码:

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); 
    } 

回答

1

库需要在libs文件夹然后,他们会自动添加到你的项目的构建路径(以S!)。

+0

对不起,你是什么意思(用s!)? – Fabii 2012-04-15 19:46:48

+0

我是否创建一个libs文件夹,在我的包资源管理器层次结构中没有看到它。 – Fabii 2012-04-15 19:47:45

+0

是的,在你的Android项目中创建一个libs文件夹(确保在Eclipse中安装了最新版本的ADT-Plugin) – 2012-04-15 19:48:56

1

我从来没有使用过的路标,所以我不能帮你。我只能分享一些我曾经做过的oauth舞蹈的代码。我使用抄写员,并且1.0和2.0 oauth规范都可以正常工作。我的webservices需要通过web浏览器验证,使用webview可以正常工作。下面的代码可能不会编译,但它来自工作(但仍在开发中)应用程序。由于我仍然在学习android,所有的评论和更正都是值得欢迎的。

整个过程从我用于与webservice进行通信的活动开始,它仅包含最初隐藏的webview内部。 init()方法是所有开始:

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

谢谢,但我需要利用路标。 – Fabii 2012-04-15 19:13:09

相关问题