2015-10-10 4 views
15

मेरे पास OAuth1 अनुरोध प्रमाणीकृत करने के लिए एक उपयोग केस है जो आरएसए प्राइवेट कुंजी का उपयोग करके हस्ताक्षरित है और आरएसए सार्वजनिक कुंजी के साथ सर्वर अंत में सत्यापित किया गया है।आरएसए-एसएचए 1 के साथ ट्विटर जोआथ का उपयोग करके OAuth1a हस्ताक्षरित अनुरोध सत्यापित करें?

मुझे यह लाइब्रेरी ट्विटर से मिली है जो हमें OAuth हस्ताक्षरित अनुरोधों को प्रमाणीकृत/सत्यापित करने में सहायता करती है। https://github.com/twitter/joauth

मैं जर्सी या स्प्रिंग एमवीसी एक्शन विधि से अनुरोध को सत्यापित करने के लिए इस लाइब्रेरी का लाभ उठाना चाहता हूं। क्लाइंट से अनुरोध निजी कुंजी का उपयोग कर हस्ताक्षर किया गया होगा। मेरे अंत में मैं अनुरोध सत्यापित करने के लिए ग्राहक की सार्वजनिक कुंजी का उपयोग करूंगा। जिसका मतलब आरएसए-एसएचए 1 अलगो है।

ट्विटर joauth उपयोगी होने लगते हैं, लेकिन मैं कोड है कि पुस्तकालय पढ़ने के लिए मुझे फ़ाइल सुविधा के रूप में यह पता चलता है, लेकिन मैं एक कोड है कि करता है javax.servlet.http.HttpServletRequest नहीं पा सके OAuthRequest

को HttpServletRequest परिणत हो गया याद आ रही है ->com.twitter.joauth.OAuthRequest परिवर्तन।

अनुरोध सत्यापन सत्यापन विधि में होता है जिसमें निम्नलिखित हस्ताक्षर होते हैं। सत्यापित करें जब विधि स्ट्रिंग पैरामीटर लेता

public VerifierResult verify(UnpackedRequest.OAuth1Request request, String tokenSecret, String consumerSecret); 

दूसरी बात मुझे यह भी पता करने के लिए जो उपयोग करने के लिए सबसे उपयुक्त तरीका है चाहता हूँ/चहचहाना joauth साथ RSA सार्वजनिक कुंजी पढ़ा है?

+0

जॉयथ का कौन सा संस्करण आप उपयोग कर रहे हैं? – Val

उत्तर

1

मैंने ट्विटर के माध्यम से उपयोगकर्ताओं को प्रमाणित करने के लिए कभी भी लाइब्रेरी का उपयोग नहीं किया है। लेकिन मैंने अभी UnpackedRequest.OAuth1Request में देखा है। आप सभी मानकों को भरकर इस वर्ग का एक उदाहरण बना सकते हैं। मैंने ट्विटर ओथ हेडर निर्माता लिखा है, इसलिए आप इसे केवल उन पैरामीटर को भरने या पुस्तकालय के बिना सीधे POST अनुरोध भेजने के लिए उपयोग कर सकते हैं।

यहाँ सभी वर्गों है कि तुम क्या जरूरत है:

हस्ताक्षर - एक OAuth हस्ताक्षर उत्पन्न करने के लिए।

public class Signature { 
    private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1"; 
    public static String calculateRFC2104HMAC(String data, String key) 
      throws java.security.SignatureException 
    { 
     String result; 
     try { 
      SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM); 
      Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM); 
      mac.init(signingKey); 
      byte[] rawHmac = mac.doFinal(data.getBytes()); 
      result = new String(Base64.encodeBase64(rawHmac)); 
     } catch (Exception e) { 
      throw new SignatureException("Failed to generate HMAC : " + e.getMessage()); 
     } 
     return result; 
    } 
} 

NvpComparator - मापदंडों आप शीर्ष लेख में की जरूरत सॉर्ट करने के लिए।

public class NvpComparator implements Comparator<NameValuePair> { 
    @Override 
    public int compare(NameValuePair arg0, NameValuePair arg1) { 
     String name0 = arg0.getName(); 
     String name1 = arg1.getName(); 
     return name0.compareTo(name1); 
    } 
} 

OAuth - यूआरएल एनकोड के लिए।

class OAuth{ 
... 
    public static String percentEncode(String s) { 
      return URLEncoder.encode(s, "UTF-8") 
        .replace("+", "%20").replace("*", "%2A") 
        .replace("%7E", "~"); 
    } 
... 
} 

HeaderCreator - सभी आवश्यक मानकों को बना सकते हैं और एक OAuth हैडर परम उत्पन्न करने के लिए।

public class HeaderCreator { 
    private String authorization = "OAuth "; 
    private String oAuthSignature; 
    private String oAuthNonce; 
    private String oAuthTimestamp; 
    private String oAuthConsumerSecret; 
    private String oAuthTokenSecret; 

    public String getAuthorization() { 
     return authorization; 
    } 

    public String getoAuthSignature() { 
     return oAuthSignature; 
    } 

    public String getoAuthNonce() { 
     return oAuthNonce; 
    } 

    public String getoAuthTimestamp() { 
     return oAuthTimestamp; 
    } 

    public HeaderCreator(){} 

    public HeaderCreator(String oAuthConsumerSecret){ 
     this.oAuthConsumerSecret = oAuthConsumerSecret; 
    } 

    public HeaderCreator(String oAuthConsumerSecret, String oAuthTokenSecret){ 
     this(oAuthConsumerSecret); 
     this.oAuthTokenSecret = oAuthTokenSecret; 
    } 

    public String getTwitterServerTime() throws IOException, ParseException { 
     HttpsURLConnection con = (HttpsURLConnection) 
       new URL("https://api.twitter.com/oauth/request_token").openConnection(); 
     con.setRequestMethod("HEAD"); 
     con.getResponseCode(); 
     String twitterDate= con.getHeaderField("Date"); 
     DateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.ENGLISH); 
     Date date = formatter.parse(twitterDate); 
     return String.valueOf(date.getTime()/1000L); 
    } 

    public String generatedSignature(String url, String method, List<NameValuePair> allParams, 
            boolean withToken) throws SignatureException { 
     oAuthNonce = String.valueOf(System.currentTimeMillis()); 
     allParams.add(new BasicNameValuePair("oauth_nonce", oAuthNonce)); 
     try { 
      oAuthTimestamp = getTwitterServerTime(); 
      allParams.add(new BasicNameValuePair("oauth_timestamp", oAuthTimestamp)); 
     }catch (Exception ex){ 
      //TODO: Log!! 
     } 

     Collections.sort(allParams, new NvpComparator()); 
     StringBuffer params = new StringBuffer(); 
     for(int i=0;i<allParams.size();i++) 
     { 
      NameValuePair nvp = allParams.get(i); 
      if (i>0) { 
       params.append("&"); 
      } 
      params.append(nvp.getName() + "=" + OAuth.percentEncode(nvp.getValue())); 
     } 
     String signatureBaseStringTemplate = "%s&%s&%s"; 
     String signatureBaseString = String.format(signatureBaseStringTemplate, 
       OAuth.percentEncode(method), 
       OAuth.percentEncode(url), 
       OAuth.percentEncode(params.toString())); 
     String compositeKey = OAuth.percentEncode(oAuthConsumerSecret)+"&"; 
     if(withToken) compositeKey+=OAuth.percentEncode(oAuthTokenSecret); 
     oAuthSignature = Signature.calculateRFC2104HMAC(signatureBaseString, compositeKey); 

     return oAuthSignature; 
    } 

    public String generatedAuthorization(List<NameValuePair> allParams){ 
     authorization = "OAuth "; 
     Collections.sort(allParams, new NvpComparator()); 
     for(NameValuePair nvm : allParams){ 
      authorization+=nvm.getName()+"="+OAuth.percentEncode(nvm.getValue())+", "; 
     } 
     authorization=authorization.substring(0,authorization.length()-2); 
     return authorization; 
    } 

} 

के बारे में बताएं:
1. getTwitterServerTime
oAuthTimestamp में आप सर्वर अपना समय लेकिन एक ट्विटर सर्वर के समय की जरूरत नहीं है। यदि आप हमेशा कुछ ट्विटर सर्वर में अनुरोध भेजते हैं तो आप इसे इस पैरा को सहेजने के लिए अनुकूलित कर सकते हैं।

2. HeaderCreator.generatedSignature (...)
यूआरएल - तार्किक चहचहाना एपीआई के लिए URL
विधि - GET या POST।आपको हमेशा "POST"
ऑल पैराम्स का उपयोग करना होगा - पैरामीटर जिन्हें आप हस्ताक्षर उत्पन्न करने के लिए जानते हैं ("param_name", "param_value");
टोकन के साथ - यदि आप जानते हैं कि OAuthTokenSecret सच है। अन्यथा झूठी।

3. हेडरक्रिएटर.generated प्राधिकरण (...)
उत्पन्न होने के बाद इस विधि का उपयोग करें हस्ताक्षर (...) ओएथ हेडर स्ट्रिंग उत्पन्न करने के लिए।
allParams - यह पैरामीटर है जिसे आपने जेनरेट सिग्नेचर (...) प्लस: गैर, हस्ताक्षर, टाइमस्टैम्प में उपयोग किया है। हमेशा उपयोग करें:

allParams.add(new BasicNameValuePair("oauth_nonce", headerCreator.getoAuthNonce())); 
allParams.add(new BasicNameValuePair("oauth_signature", headerCreator.getoAuthSignature())); 
allParams.add(new BasicNameValuePair("oauth_timestamp", headerCreator.getoAuthTimestamp())); 


अब आप उपयोग कर सकते हैं अपने पुस्तकालय में UnpackedRequest.OAuth1Request भरने के लिए।
लाइब्रेरी के बिना SpringMVC में उपयोगकर्ता को प्रमाणीकृत करने के लिए यहां एक उदाहरण:
अनुरोध - पोस्ट अनुरोध भेजने के लिए।

public class Requests { 
    public static String sendPost(String url, String urlParameters, Map<String, String> prop) throws Exception { 
     URL obj = new URL(url); 
     HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); 

     con.setRequestMethod("POST"); 
     if(prop!=null) { 
      for (Map.Entry<String, String> entry : prop.entrySet()) { 
       con.setRequestProperty(entry.getKey(), entry.getValue()); 
      } 
     } 
     con.setDoOutput(true); 
     DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 
     wr.writeBytes(urlParameters); 
     wr.flush(); 
     wr.close(); 
     int responseCode = con.getResponseCode(); 
     BufferedReader in; 
     if(responseCode==200) { 
      in = new BufferedReader(
        new InputStreamReader(con.getInputStream())); 
     }else{ 
      in = new BufferedReader(
        new InputStreamReader(con.getErrorStream())); 
     } 
     String inputLine; 
     StringBuffer response = new StringBuffer(); 
     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
     in.close(); 

     return response.toString(); 
    } 
} 

twAuth (...) - अपने नियंत्रक में रख दें। जब कोई उपयोगकर्ता ट्विटर के माध्यम से आपकी साइट में प्रमाणित करना चाहता है तो इसे निष्पादित करें।

@RequestMapping(value = "/twauth", method = RequestMethod.GET) 
    @ResponseBody 
    public String twAuth(HttpServletResponse response) throws Exception{ 
     try { 
      String url = "https://api.twitter.com/oauth/request_token"; 

      List<NameValuePair> allParams = new ArrayList<NameValuePair>(); 
      allParams.add(new BasicNameValuePair("oauth_callback", "http://127.0.0.1:8080/twlogin")); 
      allParams.add(new BasicNameValuePair("oauth_consumer_key", "2YhNLyum1VY10UrWBMqBnatiT")); 
      allParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1")); 
      allParams.add(new BasicNameValuePair("oauth_version", "1.0")); 

      HeaderCreator headerCreator = new HeaderCreator("RUesRE56vVWzN9VFcfA0jCBz9VkvkAmidXj8d1h2tS5EZDipSL"); 
      headerCreator.generatedSignature(url,"POST",allParams,false); 
      allParams.add(new BasicNameValuePair("oauth_nonce", headerCreator.getoAuthNonce())); 
      allParams.add(new BasicNameValuePair("oauth_signature", headerCreator.getoAuthSignature())); 
      allParams.add(new BasicNameValuePair("oauth_timestamp", headerCreator.getoAuthTimestamp())); 

      Map<String, String> props = new HashMap<String, String>(); 
      props.put("Authorization", headerCreator.generatedAuthorization(allParams)); 
      String twitterResponse = Requests.sendPost(url,"",props); 
      Integer indOAuthToken = twitterResponse.indexOf("oauth_token"); 
      String oAuthToken = twitterResponse.substring(indOAuthToken, twitterResponse.indexOf("&",indOAuthToken)); 

      response.sendRedirect("https://api.twitter.com/oauth/authenticate?" + oAuthToken); 
     }catch (Exception ex){ 
      //TODO: Log 
      throw new Exception(); 
     } 
     return "main"; 
    } 

twLogin (...) - अपने नियंत्रक में रख दें। यह ट्विटर से कॉलबैक है।

@RequestMapping(value = "/twlogin", method = RequestMethod.GET) 
    public String twLogin(@RequestParam("oauth_token") String oauthToken, 
          @RequestParam("oauth_verifier") String oauthVerifier, 
          Model model, HttpServletRequest request){ 
     try { 
      if(oauthToken==null || oauthToken.equals("") || 
        oauthVerifier==null || oauthVerifier.equals("")) 
       return "main"; 

      String url = "https://api.twitter.com/oauth/access_token"; 

      List<NameValuePair> allParams = new ArrayList<NameValuePair>(); 
      allParams.add(new BasicNameValuePair("oauth_consumer_key", "2YhNLyum1VY10UrWBMqBnatiT")); 
      allParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1")); 
      allParams.add(new BasicNameValuePair("oauth_token", oauthToken)); 
      allParams.add(new BasicNameValuePair("oauth_version", "1.0")); 
      NameValuePair oAuthVerifier = new BasicNameValuePair("oauth_verifier", oauthVerifier); 
      allParams.add(oAuthVerifier); 

      HeaderCreator headerCreator = new HeaderCreator("RUesRE56vVWzN9VFcfA0jCBz9VkvkAmidXj8d1h2tS5EZDipSL"); 
      headerCreator.generatedSignature(url,"POST",allParams,false); 
      allParams.add(new BasicNameValuePair("oauth_nonce", headerCreator.getoAuthNonce())); 
      allParams.add(new BasicNameValuePair("oauth_signature", headerCreator.getoAuthSignature())); 
      allParams.add(new BasicNameValuePair("oauth_timestamp", headerCreator.getoAuthTimestamp())); 
      allParams.remove(oAuthVerifier); 

      Map<String, String> props = new HashMap<String, String>(); 
      props.put("Authorization", headerCreator.generatedAuthorization(allParams)); 

      String twitterResponse = Requests.sendPost(url,"oauth_verifier="+oauthVerifier,props); 

      //Get user id 

      Integer startIndexTmp = twitterResponse.indexOf("user_id")+8; 
      Integer endIndexTmp = twitterResponse.indexOf("&",startIndexTmp); 
      if(endIndexTmp<=0) endIndexTmp = twitterResponse.length()-1; 
      Long userId = Long.parseLong(twitterResponse.substring(startIndexTmp, endIndexTmp)); 

      //Do what do you want... 

     }catch (Exception ex){ 
      //TODO: Log 
      throw new Exception(); 
     } 
    } 
+0

इस तरह के एक विस्तृत जवाब साझा करने के लिए धन्यवाद। –

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