这个问题在接受我的采访时被问到了。我在网上搜索但找不到以对我有意义的方式解释它的线程。
假设我有一个Web服务,它返回一些可用的列表 在公共域中(任何机构都可以使用)用于安全性用户需要一个访问该Web服务的密钥。
如何在Ajax中安全地使用该Web服务。
问题是,如果我使用Ajax访问该Web服务,任何机构都可以看到我的私钥,
我建议加密,但我必须在解密(我得到)中传递该密钥 比我建议的中介文件(在服务器端)我可以调用该Web服务,但如果有人直接访问该中介文件(我知道相同的原始策略)该怎么办
我真的想知道解决这些问题的可能解决方案是什么,以及在休息时进行安全的ajax调用的最佳做法是什么
答案 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();
}
}