我们正在尝试在我们的应用程序中集成“使用twitter登录”功能,为此我们使用javascript(hello.js)。
不幸的是,Twitter正在使用oauth 1.0,因此我们不能只使用javascript解决方案,但我们需要实现服务器到服务器的通信来签署请求。 hello.js作者基于node.js为演示目的提供了auth-server实现。
在我们的后端部分应用程序中,我们正在使用java,我想知道是否存在用于此目的的java解决方案。我可以使用signpost或类似作品来完成auth-server的工作吗?
[UPDATE] 我试图将hello.js使用的代理设置为我的servlet(所以,现在我在buildpath中使用带有oauth的localhost servlet而不是herokuap。)
此servlet正在执行以下操作:
OAuthConsumer consumer = new DefaultOAuthConsumer(
"xxxx",
"yyyyyyyyyyy");
OAuthProvider provider = new DefaultOAuthProvider(
"https://api.twitter.com/oauth/request_token",
"https://api.twitter.com/oauth/access_token",
"https://api.twitter.com/oauth/authorize");
System.out.println("Fetching request token from Twitter...");
// we do not support callbacks, thus pass OOB
String authUrl = provider.retrieveRequestToken(consumer, "http://localhost:8080/oauth1/twitter/response_server");
URL url = new URL(authUrl);
HttpURLConnection req = (HttpURLConnection) url.openConnection();
req.setRequestMethod("GET");
req.connect();
BufferedReader rd = new BufferedReader(new InputStreamReader(req.getInputStream()));
StringBuilder d = new StringBuilder();
String line = null;
while ((line = rd.readLine()) != null){
d.append(line + '\n');
}
System.out.println(d);
PrintWriter out = response.getWriter();
out.println(d);
并在hello.js弹出窗口中打印twitter登录页面。通过这种方式,我得到了一些编码错误,但它非常有用。
无论如何,回调网址被映射到另一个servlet,我只需要“签署”请求,但我想我错过了一些东西,因为有时我得到了错误 “服务器理解请求,但它仍然拒绝它” 但如果我关闭所有浏览器窗口就可以了。
然而,响应servlet与此类似
OAuthConsumer consumer = new AbstractOAuthConsumer(
"xxxxx",
"yyyyyyyyyyy"){
@Override
protected HttpRequest wrap(Object arg0) {
return (HttpRequest)arg0;
}
};
consumer.sign(request);
但是这段代码不起作用,因为我不知道如何签署tomcat请求。在oauth主页中解释了如何签署jetty和apache常见的http请求而不是tomcat的请求。但是,我的方法是否正确?