用于注册的REST API

时间:2013-06-21 08:30:41

标签: java rest captcha recaptcha

我们希望在我们的软件(用java编写)中集成一个公共RESTful API,可以被各种客户用来构建小型电子商务应用程序(例如Android或iPhone)。此API包括获取产品,类别,购物车支持等列表。

我们需要提供一个API,允许用户注册和其他一些敏感功能。我们应该如何保护此API免受垃圾邮件和暴力攻击?在标准产品中,我们使用reCAPTCHA。 REST对应的任何替代方案?

1 个答案:

答案 0 :(得分:1)

首先,考虑关注点的分离。 REST API的目的是什么?

REST API应该为客户端提供服务。客户端通过REST协议发送请求,并获取其请求的响应。在代码中,这看起来像:

@GET
public Response getClientInfo(@QueryParam("clientId") Integer clientId) {
     ClientDTO clientDTO = database.getClientInfo(clientId);
     return ResponseWrapper.wrap(clientDTO);
}

现在,您希望您的REST方法仅执行此操作而不执行任何其他操作。否则,你会在你的REST方法中加入 block-bruteforce-and-spam-logic ,你会得到一堆不可扩展,难以版本等的代码。如果你想改变你的,例如黑名单政策你必须改变每一种REST方法,而且它很笨重。如果要在使用REST方法之前检查调用,请查看过滤器。每个请求和响应都通过一系列过滤器,可以检查是否误用了服务器。

我不知道你的技术堆栈是什么,但我建议你研究一下:

  • JBoss AS7。
  • DeltaSpike(使您能够在执行REST方法之前检查用户权限和执行权限的强大拦截器。)

例如:

@LoggedInUser
@GET
public Response getClientInfo(...) {
    ...
}

此安全注释@LoggedInUser(顺便说一句,您定义)将向拦截器发出签名以检查此安全约束,例如

@Secures (built in annotation)
@LoggedInUser
public boolean hasRight(Identity identity) {
    return identity.isLoggedIn(); //or if he is in certain group of users
}
  • 上下文和依赖注入上下文(在DeltaSpike中使用)。
  • JBoss Filters(一个过滤器链,您可以在其中创建自己的过滤器,例如,检查某些IP是否尝试在很短的时间内发送多个呼叫~10行代码)。

过滤器的一个例子

@Startup
@ApplicationScoped
@Filter(around= "org.jboss.seam.web.ajax4jsfFilter")
public class IPTrackerFilter extends AbstractFilter {

    //IPTracker is your @ApplicationScoped bean that remembers all IP addresses accessing the application.
    @Inject
    private IPTracker fIPTracker;

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        if (!(req instanceof HttpServletRequest)) {
            chain.doFilter(req, res);
            return;
        }

        final String ipAddress= ((HttpServletRequest)req).getRemoteAddr();
        if (fIPTracker.isBlackListed(ipAddress)) {
            //implement error message here
            sendErrorMessage(response);
            return;
        } else {
            //all good, continue
            chain.doFilter(req, res);
        }
    }
}

PS。我给了你DeltaSpike的链接,其他人很容易找到。此外,如果您发现DeltaSpike模糊不清,请尝试使用JBoss Seam Security Framework