Безопасный вызов Ajax On Rest Api

Этот вопрос был задан мне в интервью. я ищу в Интернете, но не могу найти поток, который объясняет это таким образом, который имеет смысл для меня.

Предположим, у меня есть веб-сервис, который возвращает список чего-то и доступного В общедоступном домене (любой орган может использовать это) Для обеспечения безопасности Пользователь должен использовать ключ для доступа к этой веб-службе.

Как я могу безопасно использовать этот веб-сервис в Ajax.

Проблема в том, что я использую Ajax для доступа к этой веб-службе, любой орган может видеть мой закрытый ключ,

Я предлагаю для шифрования, но я должен передать этот ключ в расшифровке (как я понял) в форме Чем я предлагаю для файла медиатора (на стороне сервера), на котором я могу вызвать этот веб-сервис, но что, если кто-то напрямую обратится к этому файлу-посреднику (я знаю, что такое политика происхождения)

Я действительно хочу знать, каково возможное решение для преодоления этой проблемы, и что лучше всего сделать для безопасного аякс-вызова при отдыхе

3 ответа

Фактически в OAuth2 имеется выделенный поток безопасности для этого конкретного случая использования, называемого "Неявный поток грантов".

Вы можете посмотреть эти ссылки для более подробной информации:

Если вы не используете OAuth2, вы можете предложить пользователю пройти аутентификацию и вернуть токен доступа. Вы можете сохранить его в локальном хранилище своего браузера, но вам нужно быть очень осторожным с XSS. Этот вопрос (и его ответы) может дать вам несколько советов по такой проблеме: Какие (если есть) недостатки безопасности REST Basic Authentication с клиентами Javascript?.

Надеюсь, это поможет вам, Thierry


Если у вас нет 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();
 } 
}


Мы используем файлы cookie для этого. И, подобно сеансу, мы сохранили защищенный ключ на веб-сервере. С помощью Cookie мы можем получить безопасный ключ. Поэтому он просто видит "ключ" своего ключа. Невозможно скрыть всю информацию от клиента. Но вы можете показать ему информацию, он не может использовать ее напрямую.

Но вообще-то проблема рыболовства. Если кто-то ловит ваши файлы cookie, у него есть "ключ" вашего защищенного ключа. Многие другие делают это симулятором. Например. Facebook.

Это не относится к вызовам Ajax, но поскольку он работает как для обычных GET, так и для AJAX Calls, это будет решение.

licensed under cc by-sa 3.0 with attribution.