当前位置: 首页 > 面试题库 >

用Java实现OAuth

景永春
2023-03-14
问题内容

我尝试用Java的编程思想实现OAuth,但失败了。我不知道为什么,但是我的代码不起作用。每次运行程序时,都会引发IOException,其原因为“
java.io.IOException:服务器返回的HTTP响应代码:401”(401表示未授权)。我仔细查看了文档,但是我真的不明白为什么它不起作用。我想使用的OAuth提供程序是twitter,我也在其中注册了我的应用程序
在此先感谢
phineas

OAuth文档
Twitter API Wiki
类Base64Coder

import java.io.InputStreamReader;
import java.io.BufferedReader; 
import java.io.OutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;
import java.net.URLConnection;
import java.net.MalformedURLException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;

public class Request {
    public static String read(String url) {
        StringBuffer buffer = new StringBuffer();
        try {
        /** 
         * get the time - note: value below zero 
         * the millisecond value is used for oauth_nonce later on
         */
            int millis = (int) System.currentTimeMillis() * -1;
            int time = (int) millis / 1000;

            /**
             * Listing of all parameters necessary to retrieve a token
             * (sorted lexicographically as demanded)
             */
             String[][] data = {
                {"oauth_callback", "SOME_URL"},
                {"oauth_consumer_key", "MY_CONSUMER_KEY"},
                {"oauth_nonce",  String.valueOf(millis)},
                {"oauth_signature", ""},
                {"oauth_signature_method", "HMAC-SHA1"},
                {"oauth_timestamp", String.valueOf(time)},
                {"oauth_version", "1.0"}
            };

            /**
             * Generation of the signature base string
             */
            String signature_base_string = 
                "POST&"+URLEncoder.encode(url, "UTF-8")+"&";
            for(int i = 0; i < data.length; i++) {
                // ignore the empty oauth_signature field
                if(i != 3) {
                signature_base_string +=
                    URLEncoder.encode(data[i][0], "UTF-8") + "%3D" +
                    URLEncoder.encode(data[i][1], "UTF-8") + "%26";
                }
            }
            // cut the last appended %26 
            signature_base_string = signature_base_string.substring(0,
                signature_base_string.length()-3);

            /**
             * Sign the request
             */
            Mac m = Mac.getInstance("HmacSHA1");
            m.init(new SecretKeySpec("CONSUMER_SECRET".getBytes(), "HmacSHA1"));
            m.update(signature_base_string.getBytes());
            byte[] res = m.doFinal();
            String sig = String.valueOf(Base64Coder.encode(res));
            data[3][1] = sig;

           /**
            * Create the header for the request
            */
           String header = "OAuth ";
           for(String[] item : data) {
                header += item[0]+"=\""+item[1]+"\", ";
           }
           // cut off last appended comma
           header = header.substring(0, header.length()-2);

           System.out.println("Signature Base String: "+signature_base_string);
           System.out.println("Authorization Header: "+header);
           System.out.println("Signature: "+sig);

           String charset = "UTF-8";
           URLConnection connection = new URL(url).openConnection();
           connection.setDoInput(true);
           connection.setDoOutput(true);
           connection.setRequestProperty("Accept-Charset", charset);
           connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
           connection.setRequestProperty("Authorization", header);
           connection.setRequestProperty("User-Agent", "XXXX");
           OutputStream output = connection.getOutputStream();
           output.write(header.getBytes(charset));

           BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

           String read;
           while((read = reader.readLine()) != null) {
               buffer.append(read);
           }
        }
        catch(Exception e) {
            e.printStackTrace();
        }

       return buffer.toString();
   }

   public static void main(String[] args) {
       System.out.println(Request.read("http://api.twitter.com/oauth/request_token"));
   }
}

问题答案:

尝试删除参数“ oauth_callback”。它为我工作。我正在处理的应用程序是一个Web应用程序。



 类似资料:
  • 问题内容: 因此,我正在开发一个简单的Java应用程序,该应用程序允许用户输入图像作为查询,并使该应用程序将其与图像数据库进行比较(基本上只不过是不同图像的目录)。我基本上是在研究几种图像相似性测量技术,以找出哪些适合比较汽车图片。 我一直在做一些阅读,除了FFT / SSIM之外,我还阅读了SIFT算法可以产生非常好的结果。但是,作为只有大约一年的Java基本经验的人,老实说,我不确定我是否有足

  • 这是实现上述关系的正确方法吗?我需要解释一下。谢谢。

  • 问题内容: 这个问题与我有关Java中现有协程实现的问题有关。如我所怀疑的,如果事实证明Java中尚没有完整的协程实现,那么实现这些协程将需要什么? 正如我在该问题中所说的,我了解以下内容: 您可以将“协程”实现为后台的线程/线程池。 您可以在后台使用JVM字节码来完成棘手的事情,以使协程成为可能。 所谓的“达芬奇机” JVM实现具有使协程在无需字节码操作的情况下就可以实现的原语。 也有多种基于J

  • 我是Qpid的新手,我正在尝试设置环境。在阅读了大量文档之后,我设法下载了Apache Qpid并在localhost:8080中运行它 我还安装了maven、cmake。现在我正在尝试在Eclipse中启动一个新的maven项目以发送一条简单的消息。我根本不熟悉API接口和概念。我必须在我的项目解决方案中包含任何类型的jar吗?或者我如何使用服务器? 我也找到了这个https://github.

  • 用java实现以下场景,有100条商品,每个商品的价格0到1000元不等 商品数据: 例如200元 加价之后就是240元 利润是40元 首先把0到300元的商品的加价30%,301到500的加价20%,501到1000元商品的加价10%, 然后0到300元的商品订单有300条,301-500的商品订单有400条,501-1000的商品订单有300条, 最后计算他的总利润有多少,最好写出算法

  • 问题内容: hashCode()如何实现? 我的假设是它将对象存储位置用作运行哈希函数的初始数字(种子)。然而,这种情况并非如此。 我还研究了Hash:它在内部如何工作?但它不能回答我的问题。 是的,我可以下载SDK,但是在执行此操作并查看代码之前,也许其他人已经知道了。 谢谢 :) 编辑: 我知道它应该被覆盖等等,所以请尝试保持话题:) 问题答案: 当然,它是特定于实现的,但是通常,对象的哈希码