OAuth 1.0,javascript和服务器到服务器身份验证

时间:2014-04-13 17:54:45

标签: oauth hello.js

我们正在尝试在我们的应用程序中集成“使用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的请求。但是,我的方法是否正确?

1 个答案:

答案 0 :(得分:0)

请查看node-oauth-shim使用我的// auth-server以及HelloJS提供的规范。