2010-10-24 29 views
1

嗨 在我的android应用程序中,我可以在登录后立即拨打Twitter api。我正在使用OAuthConsumer的相同实例。但是当我为随后的调用创建OAuthconsumer并使用setTokenWithSecret时,我得到错误的签名错误。在Android上访问Twitter api时签名不正确

我花了几个小时试图调试,但没有运气......任何帮助表示赞赏。

以下是代码...在onnewIntent if语句1 == 1级的作品,但我得到不正确的签名错误。如果我打电话核实Twitter的适配器方法

private static String TAG = "OAuthForTwitter"; 

private CommonsHttpOAuthConsumer httpOauthConsumer; 
private OAuthProvider httpOauthprovider; 
public final static String consumerKey = ""; 
public final static String consumerSecret = ""; 
private final String CALLBACKURL = "myapp://mainactivity"; 


@Override 
protected void onNewIntent(Intent intent) { 

    super.onNewIntent(intent); 
    Log.d(TAG, "onNewIntent"); 

    Uri uri = intent.getData(); 

    if (uri != null && uri.toString().startsWith(CALLBACKURL)) { 

     String verifier = uri 
       .getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER); 

     Log.d(TAG, "onNewIntent " + " verifier " + verifier); 
     try { 

      httpOauthprovider.retrieveAccessToken(httpOauthConsumer, 
        verifier); 
      String userKey = httpOauthConsumer.getToken(); 
      String userSecret = httpOauthConsumer.getConsumerSecret(); 

      if (1 == 1) { 
       String surl = "http://api.twitter.com/1/account/verify_credentials.xml"; 

       HttpGet request = null; 
       HttpClient httpClient = null; 
       HttpResponse response = null; 
       request = new HttpGet(surl); 
       httpOauthConsumer.sign(request); 
       System.out.println("Sending request to Twitter..."); 
       httpClient = new DefaultHttpClient(); 

       response = httpClient.execute(request); 
       String sresponse = parseResponseToString(response); 
       Log.d(TAG, sresponse); 
      } else { 

       TwitterAdapter adapter = new TwitterAdapter(null, 
         consumerKey, consumerSecret, userKey, userSecret); 
       String s = adapter.VerifyUser(); 
       Log.d(TAG, s); 
      } 

     } catch (Exception e) { 
      Log.d(TAG, "onNewIntent error " + e.getMessage()); 
     } 

    } 
} 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    doOauth(); 
} 

private void doOauth() { 
    try { 
     httpOauthConsumer = new CommonsHttpOAuthConsumer(consumerKey, 
       consumerSecret); 
     httpOauthprovider = new DefaultOAuthProvider(
       "http://twitter.com/oauth/request_token", 
       "http://twitter.com/oauth/access_token", 
       "http://twitter.com/oauth/authorize"); 

     String authUrl = httpOauthprovider.retrieveRequestToken(
       httpOauthConsumer, CALLBACKURL); 

     this.startActivity(new Intent(Intent.ACTION_VIEW, Uri 
       .parse(authUrl))); 
     Log.d(TAG, "sent doOauth"); 
    } catch (Exception e) { 
     Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
    Log.d(TAG, " doOauth Complete"); 
} 


public class TwitterAdapter { 

    oauth.signpost.commonshttp.CommonsHttpOAuthConsumer httpOauthConsumer; 

    public TwitterAdapter(String username, String consumerkey,String consumersecret, String accesstoken, String accesssecret) { 

     httpOauthConsumer = new CommonsHttpOAuthConsumer(consumerkey, consumersecret); 

     httpOauthConsumer.setTokenWithSecret(accesstoken, consumersecret); 
    } 


    public String VerifyUser() throws ClientProtocolException, IOException, 
      OAuthMessageSignerException, OAuthExpectationFailedException, 
      OAuthCommunicationException { 

     String surl = "http://api.twitter.com/1/account/verify_credentials.xml"; 

     HttpGet request = null; 
     HttpClient httpClient = null; 
     HttpResponse response = null; 
     request = new HttpGet(surl); 
     httpOauthConsumer.sign(request); 
     System.out.println("Sending request to Twitter..."); 
     httpClient = new DefaultHttpClient(); 

     response = httpClient.execute(request); 
     return parseResponseToString(response); 

    } 
} 

}

回答

0

您是否尝试过使用Scribe

它有一个working example使用Twitter和它的android-ready。

+0

我想我会试试看。我一直无法弄清楚为什么上面的代码不工作。 – Yogesh 2010-10-27 15:01:20

+0

因为我是抄写员的创造者,所以我可能会帮助你。 :) – 2010-10-27 15:08:03

+0

在您的例子u必须下面的代码OAuthService服务=新ServiceBuilder() .provider(TwitterApi.class) .apiKey( “6icbcAXyZx67r8uTAUM5Qw”) .apiSecret( “SCCAdUUc6LXxiazxH3N0QfpNUvlUy84mZ2XZKiv39s”) .build(); – Yogesh 2010-10-29 04:03:55

0

我试过你的代码......它的工作原理是,如果我使用它,但如果我改变它来适合我的应用程序它不起作用。我不回应verify_credentials调用的响应。我一定错过了关于OAuth的东西。但这里是我在做什么

public class scribeauth extends Activity { 
    private static String TAG = "OAuthForTwitter"; 
    public final static String consumerKey = ""; 
    public final static String consumerSecret = ""; 
    private final String CALLBACKURL = "myapp://mainactivity"; 
    private static final String AUTHORIZE_URL = "https://twitter.com/oauth/authorize?oauth_token="; 
    private static final String PROTECTED_RESOURCE_URL = "http://api.twitter.com/1/account/verify_credentials.xml"; 
    OAuthService service = null; 
    Token requestToken = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     doOauth(); 
    } 

    private void doOauth() { 
     try { 

      service = new ServiceBuilder().provider(TwitterApi.class) 
        .apiKey(consumerKey) 
        .apiSecret(consumerSecret) 
        .callback(CALLBACKURL).build(); 

      requestToken = service.getRequestToken(); 

      this.startActivity(new Intent(Intent.ACTION_VIEW, Uri 
        .parse(AUTHORIZE_URL + requestToken.getToken()))); 

     } catch (Exception e) { 
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
     } 
     Log.d(TAG, " doOauth Complete"); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 

     super.onNewIntent(intent); 
     Log.d(TAG, "onNewIntent"); 

     Uri uri = intent.getData(); 

     if (uri != null && uri.toString().startsWith(CALLBACKURL)) { 

      String sverifier = uri 
        .getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER); 

      Verifier verifier = new Verifier(sverifier); 

      Token accessToken = service.getAccessToken(requestToken, verifier); 

      String secret = accessToken.getSecret(); 
      String token = accessToken.getToken(); 

      new TwitterAdapter().VerifyUser(consumerKey, consumerSecret, token, secret); 

     } 
    } 

    public class TwitterAdapter { 
     public String VerifyUser(String consumerkey, String consumersecret, 
       String accesstoken, String accesssecret) { 

      service = new ServiceBuilder().provider(TwitterApi.class) 
      .apiKey(consumerkey) 
      .apiSecret(consumersecret) 
      .callback(CALLBACKURL).build(); 
      OAuthRequest request = new OAuthRequest(Verb.GET,PROTECTED_RESOURCE_URL); 

      Token accessToken = new Token(accesstoken, accesssecret); 
      service.signRequest(accessToken, request); 
      Response response = request.send(); 
      String sresponse = response.getBody(); 
      Log.d(TAG, sresponse); 
      return sresponse; 
     } 
    } 
} 
+0

你得到的错误是什么? – 2010-10-29 14:33:47

+0

哦,你不需要每次创建服务。只需在构造函数中执行一次(它是线程安全的,所以不用担心) – 2010-10-29 14:34:31

+0

我得到401错误和response.getBody()返回null – Yogesh 2010-10-29 21:09:22

0

只是试图linkedinexample.java,不能行传37:验证验证=新的验证(in.nextLine());

应用程序停止。我是唯一一个??

+0

我的代码中有一个新的TwitterAdapter()。VerifyUser(consumerKey,consumerSecret,secret,token); 它应该是新的TwitterAdapter()。VerifyUser(consumerKey,consumerSecret,token,secret); – Yogesh 2010-11-18 16:20:28