2010-07-15 11 views
8

मैं अपने एंड्रॉइड ऐप के लिए ओएथ स्थापित कर रहा हूं। इसका परीक्षण करने के लिए मैंने निम्नलिखित किया: मेरे प्रोजेक्ट में साइनपॉस्ट-कोर-1.2.1.1.jar और साइनपॉस्ट-कॉमन्सhttp4-1.2.1.1.jar जोड़ा गया, "CommonsHttpOAuthConsumer उपभोक्ता" और "CommonsHttpOAuthProvider प्रदाता" चर को जोड़ा और निम्न कार्य किया बटन क्लिक किया जाता है:एंड्रॉइड ओएथ: पुनर्प्राप्ति पर अपवाद AccessToken()

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() करता है निम्नलिखित:

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

तो, उपभोक्ता और प्रदाता ब्राउज़र को खोलने से पहले सहेजे जाते हैं, here वर्णित की तरह।

विधि onResume() में मैं प्रदाता और उपभोक्ता डेटा लोड और निम्न कार्य करें:

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

तो, क्या काम करता है: 1) मैं एक requestToken और एक requestSecret मिलता है। 2) मुझे oauthUrl मिलता है। 3) मुझे अपने ऐप 4 को अधिकृत करने के लिए ब्राउज़र पेज पर निर्देशित किया गया है) मुझे अपने ऐप पर रीडायरेक्ट किया जा रहा है। 5) मुझे सत्यापनकर्ता मिल गया है। लेकिन पुनर्प्राप्ति को एक्सेस करना AccessToken (उपभोक्ता, सत्यापनकर्ता) OAuthCommunicationException के साथ विफल रहता है, "सेवा प्रदाता के साथ संचार विफल: शून्य"।

क्या किसी को पता है कि कारण क्या हो सकता है? कुछ लोगों को अनुरोध प्राप्त करने में समस्याएं लगती हैं, लेकिन यह ठीक काम करता है। मुझे आश्चर्य है कि यह एक समस्या हो सकती है कि मेरे ऐप में apache-mime4j-0.6.jar और httpmime-4.0.1.jar भी शामिल है जो मुझे मल्टीपार्ट अपलोड के लिए चाहिए।

उत्तर

13

ठीक है, मैंने इसे समझ लिया। शायद यह दूसरों के लिए सहायक है:

सबसे पहले, आपको पूरे उपभोक्ता और प्रदाता वस्तु को बचाने की आवश्यकता नहीं है। आपको बस इतना करना है कि अनुरोध को टोकन और अनुरोध सेक्रेट करें। सौभाग्य से, वे स्ट्रिंग्स हैं, इसलिए आपको उन्हें डिस्क या कुछ भी लिखने की आवश्यकता नहीं है। बस उन्हें साझा किए गए संदर्भों या उस तरह कुछ संग्रहीत करें।

अब, जब आप ब्राउज़र के द्वारा अपने onResume() विधि कहा जाता है, बस निम्न कार्य करें पुनः निर्देशित और हो:

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

यह है कि, आप टोकन और getToken के साथ गुप्त प्राप्त कर सकते हैं() और getTokenSecret(), अब।

+0

बहुत बहुत शुक्रिया ... इस मेरी समस्या हल ... महान काम मैनुअल – Panache

+0

तो आपके मामले में, 'requestToken' जिसे आपने 'consumer.setOkenWithSecret' में सेट किया है 'oauthUrl' है? और क्या मैं पूछ सकता हूं कि 'टोकनसेक्रेट' क्या है? धन्यवाद :) – dumbfingers

+0

क्षमा करें, मुझे लगता है कि मैं इसे समझ सकता हूं, 'request.getToken()' का उपयोग कर 'अनुरोध टोकन' पुनर्प्राप्त किया गया है? – dumbfingers

0

हाय मैनुअल मुझे लगता है कि आप ओथोथैलिसे से भी बच रहे हैं! हेरेस अनुरोध को सहेजने के लिए साझा किए गए संदर्भों का उपयोग करके ट्विटर के लिए OAuth को लागू करने का एक अच्छा उदाहरण है टोकन और अनुरोध, आपके समाधान की तरह, अनुरोध। http://github.com/brione/Brion-Learns-OAuth ब्रायन Emde द्वारा

यहाँ video

आशा है कि यह अन्य डेवलपर्स में मदद करता है =)

संबंधित मुद्दे