OAuth Provider 库(Java)[关闭]

Posted

技术标签:

【中文标题】OAuth Provider 库(Java)[关闭]【英文标题】:Library for OAuth Provider (Java) [closed] 【发布时间】:2010-12-16 11:03:54 【问题描述】:

我正在寻找可以帮助我构建 OAuth 提供程序的 Java 库。我必须能够接收 OAuth 签名请求并确定它们是否有效(检查签名、时间戳和 nonce 值)。

你知道是否有什么东西可以让这项任务变得更容易吗?

【问题讨论】:

换句话说,您正在寻找的是实现 OAuth provider,而不是 consumer 的 Java 库。您可能需要编辑您的问题以更正该问题。 Pablo,请更改您的问题标题和问题以反映意图。你想要一个 OAuth 提供者... 当我注意到你是它的作者时,我只是将你链接到 Scribe (github.com/fernandezpablo85/scribe-java)!你真的最终自己写了这个库吗? ;-) @Hendy 我不得不编写一个 client 库(抄写员),因为所有其他的都很糟糕。我不需要编写服务器端的东西(提供者)。也许如果有足够的需要,我会做一些“抄写服务器”的事情。谢谢 抄写员?嗯……我很困惑。那里有推特更新状态的例子吗?我没有找到... :( 【参考方案1】:

Scribe 是一个用于 Java 的 OAuth 库,由提问者自己编写。 ;-)

注意:我在这里发布这个作为答案,以便其他谷歌员工可以选择替代方案。 对于另一个基于库的替代方案,请参阅我的另一个答案“Jersey OAuth 签名库”。

一些代码来说明用法:

OAuthService service = new ServiceBuilder()
                                  .provider(TwitterApi.class)
                                  .apiKey("your_api_key")
                                  .apiSecret("your_api_secret")
                                  .build();
...
Token requestToken = service.getRequestToken();
String your_token = requestToken.getToken();
...
Verifier verifier = new Verifier("your_previously_retrieved_verifier");
 Token accessToken = service.getAccessToken(requestToken, verifier);

创建请求:

OAuthRequest request = OAuthRequest(Verb.GET, "http://api.twitter.com/1/direct_messages.json");
service.signRequest(accessToken, request);
Response response = request.send();

【讨论】:

感谢您提供信息。但请注意,此代码 sn-p 不适用于 android 4 及更高版本。看来 Android 4 需要异步任务。【参考方案2】:

http://oauth.net/code 上提到的一个库看起来很有趣(我不包括 OAuth for Spring Security 和 OAuth Signpost,它们不是您要找的):

Java library 和 examples 是 由 Praveen 的 John Kristian 提供 Alavilli 和 Dirk Ba​​lfanz。

OAuth for Spring Security 也是 可用,由 Ryan Heaton 提供。 此项目未托管在 OAuth 存储库。

OAuth Signpost 提供简单的 OAuth Java 和 Apache 的消息签名 HttpComponents(谷歌安卓 准备好!)。由马蒂亚斯提供 凯普勒。

我进一步检查了Java library,我认为它提供了客户端和服务器端代码所需的一切。以下blog post 实际上有一个完整的示例,我将服务器代码粘贴在下面(一个 JSP):

<%@ page import="net.oauth.server.*"%>
<%@ page import="net.oauth.*"%>

<%
//Presumably this should actually be looked up for a given key.
String consumerSecret="uynAeXiWTisflWX99KU1D2q5";

//Presumably the key is sent by the client. This is part of the URL, after all.
String consumerKey="orkut.com:623061448914";

//Construct the message object. Use null for the URL and let the code construct it.
OAuthMessage message=OAuthServlet.getMessage(request,null);

//Construct an accessor and a consumer
OAuthConsumer consumer=new OAuthConsumer(null, consumerKey, consumerSecret, null);
OAuthAccessor accessor=new OAuthAccessor(consumer);

//Now validate. Weirdly, validator has a void return type. It throws exceptions
//if there are problems.
SimpleOAuthValidator validator=new SimpleOAuthValidator();
validator.validateMessage(message,accessor);

//Now what? Generate some JSON here for example.
System.out.println("It must have worked"); %> 

这看起来很接近你想要的。

【讨论】:

澄清一下:Pascal 将这些库划掉了,因为它们仅用于客户端 OAuth。然而,作者正在寻找的是服务器端 OAuth 库。 您对 2013 年的回答有任何更新吗?! :) 看博文,好像是省略了token secret(所以签名验证应该不行)。此外,SimpleOAuthValidator 从不实际检查 nonce 值,这意味着此实现很容易受到重放攻击。作为起点,它仍然很有用,但您需要从它开始构建以使其功能和安全。【参考方案3】:

您可以使用Jersey OAuth Signature Library

可以使用容器过滤器为 servlet 或过滤器设置简单的 OAuth 身份验证,该过滤器在请求匹配并分派到根资源类之前过滤请求。容器过滤器是使用指向用户定义类的初始化参数注册的,如下所示:

public class OAuthAuthenticationFilter implements ContainerRequestFilter 
    @Override
    public ContainerRequest filter(ContainerRequest containerRequest) 
        // Read the OAuth parameters from the request
        OAuthServerRequest request = new OAuthServerRequest(containerRequest);
        OAuthParameters params = new OAuthParameters();
        params.readRequest(request);

        // Set the secret(s), against which we will verify the request
        OAuthSecrets secrets = new OAuthSecrets();
        // ... secret setting code ...

        // Check that the timestamp has not expired
        String timestampStr = params.getTimestamp();
        // ... timestamp checking code ...

        // Verify the signature
        try 
            if(!OAuthSignature.verify(request, params, secrets)) 
                throw new WebApplicationException(401);
            
         catch (OAuthSignatureException e) 
            throw new WebApplicationException(e, 401);
        

        // Return the request
        return containerRequest;
    

【讨论】:

我们在哪里可以找到完整的工作示例(带有单元测试)?谢谢。【参考方案4】:

Spring Security 有一个OAuth plugin

【讨论】:

我的项目中使用的不是 Spring,而是 Guice。【参考方案5】:

看起来http://oauth.googlecode.com/svn/code/java/ 上有一个库的 Subversion 存储库。看起来您必须签出并运行 maven 才能获得可执行文件。

如果您进入 example/webapp/src/main/java,他们有一些来自 Twitter、Yahoo 和其他网站的消费示例。

【讨论】:

我认为这些只是客户端库【参考方案6】:

Jersey(JAX-RS 的参考实现)通过名为 OpenSSO Auth Filter 的 Jersey 扩展支持 OAuth。但是,这需要一个额外的 OpenSSO 服务器实例。见this document for more information。

请注意,Oracle 已停止使用 OpenSSO,现在为 under ForgeRock as OpenAM。

【讨论】:

嘿...你有没有尝试过 Scribe 库?我有点困惑如何处理那个库......因为那里没有 javadoc 文件。 :(

以上是关于OAuth Provider 库(Java)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

是否已经有适用于 Java/Android 的 OAuth2 库? [关闭]

实现 2 Legged OAuth Provider

Python:OAuth 库 [关闭]

什么是最好的 OAuth2 C# 库? [关闭]

导入 OAuth2Authentication ImportError:没有名为“oauth2_provider.ext”的模块

grails-spring-security-oauth2-provider ClientCredentials filter no processing /oauth/token