3

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

我看过 Spring-security 和 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>
4

2 回答 2

2

在您的内部系统中,您可以创建一个可以使用访问令牌访问的应用程序列表。只有拥有这些授权访问令牌的开发人员/客户端应用程序才能访问。问题在于,其他人是否可以查看客户端应用程序源代码。

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

更新:更深入地了解安全性。 http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

于 2012-12-05T15:46:13.203 回答
0

举这个基本的例子:

服务器:

@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") String auth_token 获取名为 auth_token 和 resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).queryParameter("auth_token",AUTH_TOKEN) 的 http 请求参数添加一个名为auth_token的参数,关键是:服务器使用该参数并将其与自己的值“(AUTH_TOKEN.equals(auth_token)”进行比较,并用http代码响应rest是如何构建的,http 200 if acept access “(Response.Status .OK)" http 401 如果不是 "(Response.Status.UNAUTHORIZED)"

于 2012-12-05T17:56:33.683 回答