2015-05-30 9 views
5

मैं folowing अनुक्रम के साथ जावा द्वारा OAuth को लागू कर रहा हूँ और oauth_callback_confirmed = सचट्विटर OAuth अमान्य oauth_verifier पैरामीटर

2) https पर रीडायरेक्ट किया: //api.twitter.com/oauth/authenticate oauth_token = {चहचहाना से पिछले प्रतिक्रिया से oauth_token}

3) ट्विटर लॉगिन रूप में प्रकट होता है, मैं पर क्लिक करें बटन "लॉगिन"।

4) ट्विटर {callback_url} पर रीडायरेक्ट oauth_token = {इस टोकन OAuth/request_token प्रतिक्रिया से टोकन के बराबर होती है} & oauth_verifier = {} सत्यापनकर्ता

5) पोस्ट https:? //api.twitter.com/oauth/Oauth हेडर के साथ ACCESS_TOKEN oauth_token भी शामिल है, संदेश के मुख्य भाग oauth_verifier = {लौटे सत्यापनकर्ता}

6) ट्विटर प्रतिक्रिया शामिल = त्रुटि अपनी OAuth अनुरोध को संसाधित: अमान्य oauth_verifier पैरामीटर

क्या oauth_verifier साथ गलत क्या है?

कंप्यूट हस्ताक्षर विधि:

private static String computeSignature(String baseString, String keyString) throws GeneralSecurityException, UnsupportedEncodingException { 
     SecretKey secretKey = null; 

     byte[] keyBytes = keyString.getBytes(); 
     secretKey = new SecretKeySpec(keyBytes, "HmacSHA1"); 

     Mac mac = Mac.getInstance("HmacSHA1"); 
     mac.init(secretKey); 

     byte[] text = baseString.getBytes(); 

     return new String(Base64.encodeBase64(mac.doFinal(text))).trim(); 
    } 

पहले अनुरोध के लिए कोड:

String oauth_signature_method = "HMAC-SHA1"; 

    // generate any fairly random alphanumeric string as the "nonce". 
    String uuid_string = UUID.randomUUID().toString(); 
    uuid_string = uuid_string.replaceAll("-", ""); 
    String oauth_nonce = uuid_string; 

    // get the timestamp 
    Calendar tempcal = Calendar.getInstance(); 
    long ts = tempcal.getTimeInMillis(); 
    String oauth_timestamp = (new Long(ts/1000)).toString(); 
    String parameter_string = "oauth_callback=" + OauthConstants.TWITTER_OAUTH_CALLBACK 
      + "&oauth_consumer_key=" + OauthConstants.TWITTER_OAUTH_CONSUMER_KEY 
      + "&oauth_nonce=" + oauth_nonce + "&oauth_signature_method=" 
      + oauth_signature_method + "&oauth_timestamp=" + oauth_timestamp + "&oauth_version=1.0"; 
    String signature_base_string = get_or_post + "&" + encode(twitter_endpoint) + "&" + encode(parameter_string); 
    String oauth_signature = ""; 

    try { 
     oauth_signature = computeSignature(signature_base_string, OauthConstants.TWITTER_OAUTH_CONSUMER_SECRET + "&"); 
    } catch (GeneralSecurityException | UnsupportedEncodingException e) { 
     ...} 

String twitter_endpoint = "https://api.twitter.com/oauth/request_token"; 
String authorization_header_string = "OAuth oauth_callback=\"" + OauthConstants.TWITTER_OAUTH_CALLBACK 
       + "\",oauth_consumer_key=\"" + OauthConstants.TWITTER_OAUTH_CONSUMER_KEY 
       + "\",oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"" + oauth_timestamp 
       + "\",oauth_nonce=\"" + oauth_nonce + "\",oauth_version=\"1.0\",oauth_signature=\"" 
       + encode(oauth_signature) + "\""; 

// Apache httpcore 4.4.1 
HttpProcessor httpproc = HttpProcessorBuilder.create() 
       .add(new RequestContent()) 
       .add(new RequestTargetHost()) 
       .add(new RequestConnControl()) 
       .add(new RequestUserAgent("ApacheHttp/1.1")) 
       .add(new RequestExpectContinue(true)).build(); 

     HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); 
     HttpCoreContext context = HttpCoreContext.create(); 
     HttpHost host = new HttpHost(twitter_endpoint_host, 443); 
     DefaultBHttpClientConnection conn = new DefaultBHttpClientConnection(8 * 1024); 

     context.setAttribute(HttpCoreContext.HTTP_CONNECTION, conn); 
     context.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, host); 

try { 
       // initialize the HTTPS connection 
       SSLContext sslcontext = SSLContext.getInstance("TLS"); 
       sslcontext.init(null, null, null); 
       SSLSocketFactory ssf = sslcontext.getSocketFactory(); 
       Socket socket = ssf.createSocket(); 
       socket.connect(new InetSocketAddress(host.getHostName(), host.getPort()), 0); 
       conn.bind(socket); 

       BasicHttpEntityEnclosingRequest request2 = new BasicHttpEntityEnclosingRequest("POST", twitter_endpoint_path, HttpVersion.HTTP_1_1); 
       request2.setEntity(new StringEntity("", "UTF-8")); 
       request2.addHeader("Authorization", authorization_header_string); 
       httpexecutor.preProcess(request2, httpproc, context); 
       HttpResponse response2 = httpexecutor.execute(request2, conn, context); 
       httpexecutor.postProcess(response2, httpproc, context); 
} catch(Exception e) {} ... 

कोड दूसरा अनुरोध के लिए (OAuth/प्रमाणित https पर रीडायरेक्ट)

public JSONObject getTwitterAuthorizationCodeFromRequestToken(String oauth_token) { 
... 
     String twitter_endpoint = "https://api.twitter.com/oauth/authenticate"; 

     ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
     try { 
      FacesContext.getCurrentInstance().getExternalContext().redirect(twitter_endpoint + "?oauth_token=" + encode(oauth_token)); 
     } catch (IOException ex) {...} 
... 
    } 

3 अनुरोध के लिए कोड (पोस्ट ओथ/access_token)

public JSONObject getTwitterAccessTokenFromAuthorizationCode(String verifier_or_pin, String oauth_token) { 
    ... 
String oauth_signature_method = "HMAC-SHA1"; 

    // generate any fairly random alphanumeric string as the "nonce". Nonce = Number used ONCE. 
    String uuid_string = UUID.randomUUID().toString(); 
    uuid_string = uuid_string.replaceAll("-", ""); 
    String oauth_nonce = uuid_string; 

    Calendar tempcal = Calendar.getInstance(); 
    long ts = tempcal.getTimeInMillis(); 
    String oauth_timestamp = (new Long(ts/1000)).toString(); 

    // the parameter string must be in alphabetical order 
    String parameter_string = "oauth_consumer_key=" + OauthConstants.TWITTER_OAUTH_CONSUMER_KEY 
          + "&oauth_nonce=" + oauth_nonce + "&oauth_signature_method=" + oauth_signature_method 
          + "&oauth_timestamp=" + oauth_timestamp + "&oauth_token=" + encode(oauth_token) + "&oauth_version=1.0"; 

    String signature_base_string = get_or_post + "&" + encode(twitter_endpoint) + "&" + encode(parameter_string); 

    String oauth_signature = ""; 
    try { 
     oauth_signature = computeSignature(signature_base_string, OauthConstants.TWITTER_OAUTH_CONSUMER_SECRET + "&"); 
    } catch (GeneralSecurityException | UnsupportedEncodingException e) { 
     ... 
    } 

    String authorization_header_string = "OAuth oauth_consumer_key=\"" + OauthConstants.TWITTER_OAUTH_CONSUMER_KEY 
               + "\",oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"" + oauth_timestamp 
               + "\",oauth_nonce=\"" + oauth_nonce + "\",oauth_version=\"1.0\",oauth_signature=\"" 
               + encode(oauth_signature) + "\",oauth_token=\"" + encode(oauth_token) + "\""; 

    HttpProcessor httpproc = HttpProcessorBuilder.create() 
        .add(new RequestContent()) 
        .add(new RequestTargetHost()) 
        .add(new RequestConnControl()) 
        .add(new RequestUserAgent("ApacheHttp/1.1")) 
        .add(new RequestExpectContinue(true)).build(); 

      HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); 
      HttpCoreContext context = HttpCoreContext.create(); 
      HttpHost host = new HttpHost(twitter_endpoint_host, 443); 
      DefaultBHttpClientConnection conn = new DefaultBHttpClientConnection(8 * 1024); 

      context.setAttribute(HttpCoreContext.HTTP_CONNECTION, conn); 
      context.setAttribute(HttpCoreContext.HTTP_TARGET_HOST, host); 

    try { 
        SSLContext sslcontext = SSLContext.getInstance("TLS"); 
        sslcontext.init(null, null, null); 
        SSLSocketFactory ssf = sslcontext.getSocketFactory(); 
        Socket socket = ssf.createSocket(); 
        socket.connect(new InetSocketAddress(host.getHostName(), host.getPort()), 0); 
        conn.bind(socket); 

        BasicHttpEntityEnclosingRequest request2 = new BasicHttpEntityEnclosingRequest("POST", twitter_endpoint_path); 
        // Including oauth_verifier value to request body 
        request2.setEntity(new StringEntity("oauth_verifier=" + encode(verifier_or_pin), "UTF-8")); 
        request2.addHeader("Authorization", authorization_header_string); 
        httpexecutor.preProcess(request2, httpproc, context); 
        HttpResponse response2 = httpexecutor.execute(request2, conn, context); 
... 
    } 
+0

क्या आप यह करने के लिए अपना कोड दिखा सकते हैं? –

+0

@Matthew सी अपडेट किया गया प्रश्न –

+0

बिल्कुल वही समस्या होने के बाद, क्या आपको कोई समाधान मिला है? –

उत्तर

2

मैंने अपने जावास्क्रिप्ट कोड बेस के साथ एक ही स्थिति का अनुभव किया है। एक दिन संघर्ष करने के बाद, मुझे एक समाधान मिला जो त्रुटि को हल करता है। यह सिर्फ "सामग्री-प्रकार" एप्लिकेशन/x-www-form-urlencoded "के मान के साथ शीर्षलेख जोड़ रहा है।

मेरा कोड सही ढंग से काम करने के लिए उपयोग किया जाता था, लेकिन यह पिछले कुछ महीनों में काम करना बंद कर देता है। मेरा अनुमान है कि ट्विटर ने हाल ही में ओथ हैंडलिंग के कार्यान्वयन को बदल दिया है जो हमें सामग्री-प्रकार को स्पष्ट रूप से जोड़ने के लिए मजबूर करता है।

+1

मुझे लगता है कि वे इसे दस्तावेज में जोड़ देंगे, अगर यह –

+1

था तो हम ट्विटर को दोष नहीं दे सकते क्योंकि यह HTTP विनिर्देश में परिभाषित है। http://www.w3.org/Protocols/rfc2616/rfc2616-sec7.html#sec7.2.1 – Basuke

+1

बेशक, ट्विटर इंजीनियर दयालु हो सकते हैं क्योंकि वे सामग्री-प्रकार के बिना अनुरोध स्वीकार करते थे। यदि त्रुटि संदेश अधिक स्पष्ट है, तो "त्रुटि: डेटा के साथ पोस्ट अनुरोध को संभालने के लिए सामग्री-प्रकार शीर्षलेख आवश्यक है।", हम जल्द ही समस्या पा सकते हैं। – Basuke

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