首页 文章

用于注册的REST API

提问于
浏览
2

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

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

1 回答

  • 1

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

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

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

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

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

    • JBoss AS7 .

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

    例如:

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

    这个安全注释 @LoggedInUser (顺便说一句,你定义)将给一个Interceptor签名来检查这个安全约束,例如:

    @Secures (built in annotation)
    @LoggedInUser
    public boolean hasRight(Identity identity) {
        return identity.isLoggedIn(); //or if he is in certain group of users
    }
    
    • 上下文和依赖注入上下文(在DeltaSpike中使用) .

    • JBoss过滤器(一个过滤器链,您可以在其中创建自己的过滤器,例如,检查某些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 .

相关问题