我正在寻找可以帮助我构建 OAuth 提供程序的 Java 库。我必须能够接收 OAuth 签名请求并确定它们是否有效(检查签名、时间戳和 nonce 值)。
你知道是否有什么东西可以让这项任务变得更容易吗?
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();
http://oauth.net/code上提到的一个库看起来很有趣(我不包括OAuth for Spring Security和OAuth Signpost,它们不是您想要的):
Java 库和示例由John Kristian、Praveen Alavilli 和 Dirk Balfanz 提供。
Spring Security的 OAuth 也可用,由 Ryan Heaton 提供。此项目未托管在 OAuth 存储库中。
OAuth Signpost为 Java 和 Apache HttpComponents(Google Android 就绪!)提供简单的 OAuth 消息签名。由马蒂亚斯·卡普勒提供。
我进一步检查了Java 库,我认为它提供了客户端和服务器端代码所需的一切。以下博客文章实际上有一个完整的示例,我将服务器代码粘贴在下面(一个 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"); %>
这看起来接近你想要的。
您可以使用Jersey OAuth 签名库。
可以使用容器过滤器为 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;
}
}
Spring Security有一个OAuth 插件
看起来在http://oauth.googlecode.com/svn/code/java/上有一个库的 Subversion 存储库。看起来您必须签出并运行 maven 才能获得可执行文件。
如果你进入 example/webapp/src/main/java,他们有一些来自 Twitter、Yahoo 等的消费示例。
Jersey(JAX-RS 的参考实现)通过名为 OpenSSO Auth Filter 的 Jersey 扩展支持 OAuth。但是,这需要一个额外的 OpenSSO 服务器实例。有关详细信息,请参阅此文档。
请注意,Oracle 已停止使用 OpenSSO,现在作为 OpenAM 在 ForgeRock 下。