安全Ajax呼叫On Rest Api

时间:2015-09-25 07:40:52

标签: javascript jquery ajax rest security

这个问题在接受我的采访时被问到了。我在网上搜索但找不到以对我有意义的方式解释它的线程。

假设我有一个Web服务,它返回一些可用的列表 在公共域中(任何机构都可以使用)用于安全性用户需要一个访问该Web服务的密钥。

如何在Ajax中安全地使用该Web服务。

问题是,如果我使用Ajax访问该Web服务,任何机构都可以看到我的私钥,

我建议加密,但我必须在解密(我得到)中传递该密钥 比我建议的中介文件(在服务器端)我可以调用该Web服务,但如果有人直接访问该中介文件(我知道相同的原始策略)该怎么办

我真的想知道解决这些问题的可能解决方案是什么,以及在休息时进行安全的ajax调用的最佳做法是什么

3 个答案:

答案 0 :(得分:2)

事实上,OAuth2中有一个专门的安全流程,用于称为“隐式授权流程”的特定用例。

您可以查看这些链接以获取更多详细信息:

如果您不使用OAuth2,则可以建议用户进行身份验证并获取访问令牌。您可以将其存储在浏览器的本地存储中,但是您需要非常小心XSS。这个问题(及其答案)可以为您提供有关此类问题的一些提示:What are (if any) the security drawbacks of REST Basic Authentication with Javascript clients?

希望它可以帮到你, 亨利

答案 1 :(得分:0)

我们正在使用cookies。和会话一样,我们将安全密钥存储在Web服务器上。使用Cookie,我们可以获得安全密钥。所以他只看到了他的钥匙的“钥匙”。没有选项可以隐藏客户端的所有信息。但你可以向他展示信息,他不能直接使用。

但是,根本就有捕鱼问题。如果有人给你的饼干,他有你的安全密钥的“钥匙”。许多其他人正在做类似的事情。例如。主页。

这不是特定于Ajax调用,但由于它适用于普通GET和AJAX调用,因此它将是一种解决方案。

答案 2 :(得分:0)

如果您没有100%控制客户端和服务器端,则可能需要使用客户端身份验证解决方案(例如,Oauth 1或2)。 如果你对客户端和服务器端都有100%的控制权,那么简单的方法就是使用基本的身份验证+ SSL。

我们的项目是: - 我有一个宁静的服务。我们在SSL中提供宁静的服务。 - 只有我们的合作伙伴公司才能通过互联网使用它。

我们做的是: - 他们的内部应用程序(不是公共访问的网页)在他们的请求(是Ajax)中有他们的用户名/密码 - 样本如下所示的宁静代码(你可以通过Postman测试):

//  to inject request 
@Context
private HttpServletRequest request; 

@GET
@Path("/testAuth")
@Produces(MediaType.APPLICATION_JSON)
public Response testAuth() {
    // TODO 
    // this is only a template for doing authentication in the near future
    String returnString = "";

    //check if authenticated
    String authorization = request.getHeader("Authorization");
    if (authorization == null ||             authorization.toUpperCase().startsWith("BASIC ") == false) {
        //no authenticated
        returnString =  "{\"testAuth\", \"need authentication\"}"; 
        return Response.status(401).entity(returnString).build();
    } else{

        String credentials =     authorization.substring("Basic".length()).trim();
        byte[] decoded = DatatypeConverter.parseBase64Binary(credentials);
        String decodedString = new String(decoded);
        String[] actualCredentials = decodedString.split(":");
        String ID = actualCredentials[0];
        String Password = actualCredentials[1];
        String Result = userAuthenticate(ID, Password);

        returnString =  "{\"testAuth\", \"" + 
            " (" + Result + ") \"}";
        return Response.status(200).entity(returnString).build();
    }   

}