RESTful API-控制对API的访问(无登录页)

RESTful API-控制对API的访问(无登录页),rest,oauth,spring-security,jersey,reverse-engineering,Rest,Oauth,Spring Security,Jersey,Reverse Engineering,我有一个通过HTTPS进行通信的RESTful Web服务。我想阻止其他开发人员调用API。API位于一个数据库前面,该数据库从多个源中提取数据,因此我想控制谁使用它。使用登录页面不是一个选项 我看过SpringSecurity和OAuth,但是它们都没有提供我所需要的。我不想将登录页放在web服务前面,而是想在未知应用程序尝试调用我的服务时返回400或401 http代码 有人能推荐我如何实现这一点吗 结果感谢您对这个问题的反馈。最后,我求助于使用一个名为mod_authz_host的Apac

我有一个通过HTTPS进行通信的RESTful Web服务。我想阻止其他开发人员调用API。API位于一个数据库前面,该数据库从多个源中提取数据,因此我想控制谁使用它。使用登录页面不是一个选项

我看过SpringSecurity和OAuth,但是它们都没有提供我所需要的。我不想将登录页放在web服务前面,而是想在未知应用程序尝试调用我的服务时返回400或401 http代码

有人能推荐我如何实现这一点吗

结果感谢您对这个问题的反馈。最后,我求助于使用一个名为mod_authz_host的Apache模块,它允许您将HTTP模式限制到特定的域。虽然可以欺骗域,但这是针对内部应用程序的,因此安全要求更加宽松。我在下面包含了一个片段,详细介绍了如何使用Apache模块

在虚拟主机中包括以下内容

<Location /yourProtectedServices/ws>
 Order deny,allow
 Deny from all
 Allow from trusteddomain.com
</Location>

命令拒绝,允许
全盘否定
从trusteddomain.com允许

在内部系统中,您可以创建具有访问令牌访问权限的应用程序列表。只有具有这些授权访问令牌的开发人员/客户端应用程序才能访问。如果其他人可以查看客户端应用程序源代码,则会出现这种情况

例如,如果有人使用代码中的访问令牌创建了一个Android应用程序,那么当它在应用商店中分发时,它可能会被反向工程

更新: 获取有关安全性的更深入的视图。

举一个基本的例子:

服务器:

@Path("/your-path")
@RequestScoped
public class JSONService {

    private final static String  AUTH_TOKEN = "rxxkksdfnnchshs";        

    @GET
    @Produces(javax.ws.rs.core.MediaType.APPLICATION_JSON)
    public Response fetchData(@QueryParam("auth_token") String auth_token) {

        if(AUTH_TOKEN.equals(auth_token)){

            final String results = "result: the object what you want";               

            return Response.status(Response.Status.OK).entity(results).build();  
        }
        else{

            return Response.status(Response.Status.UNAUTHORIZED).build();   
        }
    }
}
客户:

@ManagedBean(name="your-bean-name")
@RequestScoped
public class ResteasyClient {
    private static final String BASE_URI    = "http://localhost:8080/your-context/your-rest-path";       
    private final static String  AUTH_TOKEN = "rxxkksdfnnchshs";
    ClientRequest webResource;
    ClientResponse response; 
    private String data;  

    public DBOResteasyClient() {           

        final String Path = "/your-path";
        webResource = new ClientRequest(BASE_URI+Path);            

    }

   @Produces
   @Named
    public String getData(){
        return this.data;
    }

    @PostConstruct
    public void fetchData() {

        try{
            ClientRequest resource = webResource;      
            response = resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).queryParameter("auth_token",AUTH_TOKEN).get(ClientResponse.class); 
        }catch(Exception e ){
            //
        }

        if(response.getStatus() == 200 ){
            data = (String) response.getEntity(String.class);               
        }
    }  
} 

此示例在服务器中使用@QueryParam(“auth_token”)字符串auth_token获取http请求的参数auth_token和resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON)。queryParameter(“auth_token”,auth_token)要添加一个名为auth_token的参数,关键是:服务器使用该参数并将其与自己的值(auth_token.equals)进行比较(auth_token)“并使用http代码响应rest是如何构建的,http 200如果acept访问”(Response.Status.OK)“http 401如果不是”(Response.Status.UNAUTHORIZED)

我很好奇,如何打开你的API让别人对你的应用程序进行反向工程?我正试图阻止其他开发人员使用这些API调用公开的内容。API位于一个数据库前面,该数据库从多个来源提取数据,我更愿意控制谁可以获取数据。我在想,这不是reverse工程您的应用程序。我要重新措辞。客户端和服务器之间的访问令牌是如何传递的,它只是一个隐藏在帖子中的额外参数吗?然后在服务器上,只需从请求中提取参数,并返回错误代码(如果无效)?是,并确保使用Http。通过ugh浏览器。你如何解决这个问题?所有的客户端应用程序都是用Javascript编写的吗?例如,如果有人在编写一个连接到你的api的web应用程序,它可以使用公共/私钥方法共享数据。这里很重要的一点是,在Javascript中没有公开私钥。我的应用程序是Javascript。但是没有任何东西可以阻止某人从服务器端调用服务。我可以实现一个拦截器来检查域,但同样,它只处理来自客户端的请求,并且可能被篡改