2010-07-15 19 views
8

Android uygulamam için OAuth ayarlıyorum. Bunu test etmek için aşağıdakileri yaptım: Projem için signpost-core-1.2.1.1.jar ve signpost-commonshttp4-1.2.1.1.jar eklendi, "CommonsHttpOAuthConsumer tüketici" ve "CommonsHttpOAuthProvider sağlayıcısı" değişkenlerini ekledik ve düğmesi tıklandığında: aşağıdakiAndroid OAuth: RetrieveAccessToken() ile ilgili İstisna()

consumer = new CommonsHttpOAuthConsumer("xxx", "yyy"); 
provider = new CommonsHttpOAuthProvider("https://api.twitter.com/oauth/request_token", 
        "https://api.twitter.com/oauth/access_token", 
        "https://api.twitter.com/oauth/authorize"); 

oauthUrl = provider.retrieveRequestToken(consumer, "myapp://twitterOauth"); 
persistOAuthData(); 
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(oauthUrl))); 

persistOAuthData() yapar:

protected void persistOAuthData() 
{ 
    try 
    { 
     FileOutputStream providerFOS = this.openFileOutput("provider.dat", MODE_PRIVATE); 
     ObjectOutputStream providerOOS = new ObjectOutputStream(providerFOS); 
     providerOOS.writeObject(this.provider); 
     providerOOS.close(); 

     FileOutputStream consumerFOS = this.openFileOutput("consumer.dat", MODE_PRIVATE); 
     ObjectOutputStream consumerOOS = new ObjectOutputStream(consumerFOS); 
     consumerOOS.writeObject(this.consumer); 
     consumerOOS.close(); 
    } 
    catch (Exception e) { } 
} 

Yani, tüketici ve sağlayıcı tarayıcısını açmadan önce kaydedilir, here tarif gibi. onResume() yönteminde

Ben sağlayıcı ve tüketici verilerini yüklemek ve aşağıdakileri yapın:

Uri uri = this.getIntent().getData(); 
    if (uri != null && uri.getScheme().equals("myapp") && uri.getHost().equals("twitterOauth")) 
    { 
     verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER); 
     if (!verifier.equals("")) 
     { 
      loadOauthData(); 
      try 
      { 
       provider.retrieveAccessToken(consumer, verifier); 
      } 
      catch (OAuthMessageSignerException e) { 
       e.printStackTrace(); 
      } catch (OAuthNotAuthorizedException e) { 
       e.printStackTrace(); 
      } catch (OAuthExpectationFailedException e) { 
       e.printStackTrace(); 
      } catch (OAuthCommunicationException e) { 
       e.printStackTrace(); 
      }    
     } 
    } 

Yani, neyin işe yaradığını: 1) Bir requestToken ve requestSecret olsun. 2) OauthUrl'i alıyorum. 3) Uygulamamı yönlendirmek için tarayıcı sayfasına yönlendirildim 4) Uygulamama yönlendiriliyor alıyorum. 5) Doğrulayıcıyı alıyorum. Ancak retrieveAccessToken (tüketici, doğrulayıcı) çağrısı, "Hizmet sağlayıcısıyla iletişim başarısız oldu: null" yazan bir OAuthCommunicationException ile başarısız oluyor.

Sebep ne olabileceğini bilen var mı? Bazı insanlar requestToken almakta zorluk çekiyor gibi görünüyor, ama bu sadece iyi çalışıyor. Ben app da dahil olmak üzere bir sorun olabilir acaba ben multipart upload için gereken apache-mime4j-0.6.jar ve httpmime-4.0.1.jar dahil.

cevap

13

Tamam, anladım. Belki bu faydalı olabilir:

Her şeyden önce, tüm tüketici ve sağlayıcı nesnesini kaydetmeniz gerekmez. Tek yapmanız gereken requestToken ve requestSecret'i saklamak. Neyse ki, bunlar Dizeler, bu yüzden onları diske veya başka bir şeye yazmana gerek yok. Bunları sadece sharedPreferences'da veya bunun gibi bir şeyde saklayın. Eğer tarayıcı tarafından yönlendirilir ve onResume() yöntemi çağrılır, sadece aşağıdakileri yapın olsun Şimdi

:

bu kadar
//The consumer object was lost because the browser got into foreground, need to instantiate it again with your apps token and secret. 
consumer = new CommonsHttpOAuthConsumer("xxx", "yyy"); 

//Set the requestToken and the tokenSecret that you got earlier by calling retrieveRequestToken. 
consumer.setTokenWithSecret(requestToken, tokenSecret); 

//The provider object is lost, too, so instantiate it again. 
provider = new CommonsHttpOAuthProvider("https://api.twitter.com/oauth/request_token", 
           "https://api.twitter.com/oauth/access_token", 
           "https://api.twitter.com/oauth/authorize");  
//Now that's really important. Because you don't perform the retrieveRequestToken method at this moment, the OAuth method is not detected automatically (there is no communication with Twitter). So, the default is 1.0 which is wrong because the initial request was performed with 1.0a. 
provider.setOAuth10a(true); 

provider.retrieveAccessToken(consumer, verifier); 

, simgeyi ve getToken ile gizli alabilir() ve Şimdi getTokenSecret().

+0

çok teşekkürler ... ... büyük iş Manuel – Panache

+0

Yani sizin durumda, "requestToken", "customer.setOkenWithSecret" öğesi "oauthUrl" olarak ayarlandı mı? ve tokenSecret'in ne olduğunu sorabilir miyim? Teşekkürler :) – dumbfingers

+0

Üzgünüm, sanırım bunu çözebilirim, 'requestToken' kullanılarak elde edildi' customer.getToken() '? – dumbfingers

0

Merhaba Manuel Ben de OAuthocalypse kaçınmak görüyorum! heres, requestToken'ı ve çözümünüz gibi requestSecret'i kaydetmek için sharedPreferences'ı kullanarak Twitter için OAuth'u uygulamak için iyi bir örnektir. Brion Emde tarafından http://github.com/brione/Brion-Learns-OAuth

heres bu sorunumu çözdü bu diğer geliştiriciler yardımcı olur video

umut =)

İlgili konular