Неправильная подпись при доступе к Twitter API на Android - PullRequest
1 голос
/ 24 октября 2010

Привет В моем приложении для Android я могу звонить в Twitter API сразу после входа в систему. Я использую тот же экземпляр OAuthConsumer. Но когда я создаю OAuthconsumer для последующего вызова и использую setTokenWithSecret, я получаю ошибку неверной подписи.

Я потратил несколько часов на отладку, но не повезло ... любая помощь приветствуется.

Ниже приведен код ... в onnewIntent, если оператор 1 == 1 работает, но я получаю неправильную ошибку подписи, если я вызываю метод verify для адаптера 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);

    }
}

}

Ответы [ 3 ]

0 голосов
/ 29 октября 2010

Я попробовал ваш код ... он работает, если я использую как есть, но если я изменю его в соответствии с моим приложением, он не будет работать.Я не получаю ответного ответа на вызов 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 голосов
/ 07 ноября 2010

только что попытался связать с linkinexample.java и не может передать строку 37: Проверяющий верификатор = новый верификатор (in.nextLine ());

приложение просто останавливается.Я один такой?

0 голосов
/ 24 октября 2010

Вы пробовали использовать Писец ?

У него есть рабочий пример с использованием Twitter, и он готов для Android.

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