0

こんにちは、このチュートリアルのこのチュートリアルに従って OAuth1.0 を実装しようとしています OAuthGetRequestToken という見出しがあります

リクエストトークンを取得するには、投稿リクエストを URL に送信する必要があります

www.google.com/accounts/OAuthGetRequestToken

Google App Engine のコードで投稿リクエストを送信しています。コードは次のとおりです。

public class HelloWorldServlet extends HttpServlet {
    @SuppressWarnings({ "unchecked", "unchecked" })
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {



        resp.setContentType("text/html");
         resp.getWriter().println("<html><head> <meta name=\"google-site-verification\" content=\"OBFeK6hFEbTkNdcYc-SQNH9tCTpcht-HkUdj6IgCaLg\" </head>");

        resp.getWriter().println("<body>Hello, world");
        //String post="key=AIzaSyBgmwbZaW3-1uaVOQ9UqlyHAUxvQtHe7X0&oauth_consumer_key=iriteshmehandiratta.appspot.com";
        //String param= "&oauth_callback=\"https://www.iriteshmehandiratta.appspot.com\"&scope=\"http://www.google.com/calendar/feeds\""; 


        //URL url=new URL("https://www.googleapis.com/prediction/v1.5/trainedmodels/10/predict?");
  TreeMap<String,String> tree=new TreeMap<String,String>();
  tree.put("oauth_version","1.0");
  tree.put("oauth_nonce", System.currentTimeMillis()+"");
  tree.put("oauth_timestamp",System.currentTimeMillis()/1000+"");
  tree.put("oauth_consumer_key", "imehandirattaritesh.appspot.com");
  tree.put("oauth_signature_method", "RSA-SHA1");

  ServletContext context = getServletContext();
  PrivateKey privKey = getPrivateKey(context,"/myrsakey11.pk8");




  tree.put("oauth_callback", "https://imehandirattaritesh.appspot.com/authsub");
  tree.put("scope", "https://www.google.com/calendar/feeds");
  Set set = tree.entrySet(); 

  Iterator<Map.Entry<String, String>> i = set.iterator(); 
  String datastring="";
  Map.Entry me=(Map.Entry)i.next();
 datastring=me.getKey()+"=";
 datastring+=me.getValue();

 while(i.hasNext()) { 
      me = (Map.Entry)i.next(); 
      datastring+="&"+me.getKey()+"="; 
      datastring+=(me.getValue()); 
      } 
  String data_string="GET&https://www.google.com/accounts/OAuthGetRequestToken&"+datastring;
 byte[] xx11;
 String str = null;
try {
    xx11 = sign(privKey,data_string);
    str=new String(xx11);
resp.getWriter().println(str);

} catch (GeneralSecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}



URL url=new URL("https://www.google.com/accounts/OAuthGetRequestToken?"+str); 
            //  resp.getWriter().println(""+datastring);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

        urlConnection.setRequestProperty("Authorization", " OAuth");

        urlConnection.setRequestMethod("GET");

        urlConnection.setDoOutput(true);

        BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));

          resp.getWriter().println( urlConnection.getResponseCode());

           String xx="";

           String xx1="";

           while((xx1=in.readLine()) != null)

           {
               xx+=xx1;


           }
           resp.getWriter().println("response");
           resp.getWriter().println(xx);
           resp.getWriter().println("</body></html>");




    }


    public static PrivateKey getPrivateKey(ServletContext context,String privKeyFileName) throws IOException {

        InputStream resourceContent = context.getResourceAsStream("/WEB-INF/myrsakey11.pk8");
         // FileInputStream fis = new FileInputStream(privKeyFile);
          DataInputStream dis  = new DataInputStream(resourceContent);

          @SuppressWarnings("deprecation")
        String str="";
          String str1="";
          while((str=dis.readLine())!=null)
          {
              str1+=str;

          }



          String BEGIN = "-----BEGIN PRIVATE KEY-----";
          String END = "-----END PRIVATE KEY-----";
         // String str = new String(privKeyBytes);

          if (str1.contains(BEGIN) && str1.contains(END)) {
            str1 = str1.substring(BEGIN.length(), str1.lastIndexOf(END));
          }

          KeyFactory fac;
        try {
            fac = KeyFactory.getInstance("RSA");

              EncodedKeySpec privKeySpec= new PKCS8EncodedKeySpec(Base64.decode(str1));
              return fac.generatePrivate(privKeySpec);

        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Base64DecoderException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         return null;

          }


    byte[] sign(PrivateKey key, String data) throws GeneralSecurityException {
        Signature signature = Signature.getInstance("SHA1withRSA"); 
        signature.initSign(key);

        signature.update(data.getBytes());
        return signature.sign(); 
        }
}

最初に data_string を生成し、秘密鍵を使用して署名します。このような暗号化された文字列を取得します

 F????T???&??$????????l:v????x???}??U-'?"?????U?[?kr^?G?(? ???qT0??]??j???5??`??$??AD??T??@<t?,#:`V????????????

次に、それを URL と連結します: https://www.google.com/accounts/OAuthGetRequestToken ? そして私は400エラーを受け取ります明らかにそれは有効なuri形式ではないので、私はこのエラーを受け取ります。しかし、含まれているoauth_signatureの代わりに、暗号化された文字列を取得しています.このdata_stringに署名する方法と、私がしている間違いを誰か教えてください??

4

1 に答える 1

0

OAuth を実行するには、既存の Java ライブラリを使用することをお勧めします。長期的にははるかに簡単になり、プロトコルのデバッグについて心配する必要がなくなります。

于 2013-01-11T16:38:32.190 に答える