Twitter oauth请求令牌响应代码401

Twitter oauth请求令牌响应代码401,twitter,oauth,request,token,Twitter,Oauth,Request,Token,我正在使用twitter oauth登录。但是,当我执行请求\u令牌,第一步,响应代码总是返回401 Unauthorized 我已经搜索了一个星期了,但是我找不到解决方案,请帮忙 这是我的连接: URL url = new URL("https://api.twitter.com/oauth/request_token"); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestProp

我正在使用twitter oauth登录。但是,当我执行
请求\u令牌
,第一步,响应代码总是返回
401 Unauthorized

我已经搜索了一个星期了,但是我找不到解决方案,请帮忙

这是我的连接:

URL url = new URL("https://api.twitter.com/oauth/request_token");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestProperty("Host","api.twitter.com");
conn.setRequestProperty("Authorization", data);
conn.setRequestMethod("POST");
conn.connect();
对于我的数据:

String data = "OAuth oauth_nonce=\"" + oauth_nonce
    + "\", oauth_callback=\"" + oauth_callback
    + "\", oauth_signature_method=\"" + oauth_signature_method
    + "\", oauth_timestamp=\"" + oauth_timestamp
    + "\", oauth_consumer_key=\"" + oauth_consumer_key
    + "\", oauth_signature=\"" + oauth_signature
    + "\", oauth_version=\"" + oauth_version + "\"";  
另外,我确信我的签名是正确的,因为我使用了twitter示例的参数,我可以计算与示例相同的结果,所以我认为我的方法是正确的

以下是我的计算:

String oauth_para = "oauth_callback=" + oauth_callback
    + "&oauth_consumer_key=" + oauth_consumer_key
    + "&oauth_nonce=" + oauth_nonce
    + "&oauth_signature_method=" + oauth_signature_method
    + "&oauth_timestamp=" + oauth_timestamp
    + "&oauth_version=" + oauth_version;

String signingRequests = "POST&" + requestToken + "&" + URLEncoder.encode(oauth_para, "UTF-8");

String key = oauth_consumer_secret + "&";
SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");

Mac mac = null;
try {
    mac = Mac.getInstance("HmacSHA1");
    mac.init(signingKey);
}
catch(Exception e) {
    System.err.println("Error: " + e);
}
byte[] rawHmac = mac.doFinal(signingRequests.getBytes());

String oauth_signature =  Base64.encodeBytes(rawHmac);
oauth_signature = URLEncoder.encode(oauth_signature);
我知道nonce和timestamp应该是随机和唯一的。所以,我的方法是:

StringBuffer buffer = new StringBuffer("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); 
StringBuffer sb = new StringBuffer(); 
Random r = new Random(); 
int range = buffer.length(); 
for (int i = 0; i < 43;i ++) { 
    sb.append(buffer.charAt(r.nextInt(range))); 
} 
long epoch = System.currentTimeMillis() / 1000;
String oauth_nonce = sb.toString();
StringBuffer buffer=new StringBuffer(“0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyz”);
StringBuffer sb=新的StringBuffer();
随机r=新随机();
int range=buffer.length();
对于(int i=0;i<43;i++){
sb.append(缓冲区字符(r.nextInt(范围));
} 
长历元=System.currentTimeMillis()/1000;
字符串oauth_nonce=sb.toString();
有人能帮我吗


附言:我还删除了我的应用程序,然后创建了一个新的。结果也是一样的。另外,应用程序已经可以读写了。

嘿,我一分钟前也遇到了同样的问题,但我已经解决了。至少我的问题是,在应用程序的配置中(在twitter内部),我的应用程序类型是客户端,而什么时候应该是浏览器!所以我改成了浏览器,放了一个回调URL,效果很好

确保您的服务器时间与Twitter服务器的时间同步在五分钟之内。当您构建签名请求字符串时,requestToken的值是多少?它应该是空的,因为这是OAuth进程的第一步。Ian,你曾经让它工作过吗?我也遇到了同样的问题(401)。我突然发现它工作起来了。我认为生成的令牌存在一些问题,请仔细检查令牌是否正确。并且你的应用程序域配置应该设置正确。谢谢,这也为我解决了这个问题。Twitter的设置中不再有应用程序类型。相反,只需填写应用程序设置中的
回调URL
字段即可。更多信息,请访问: