База кода, с которой я работаю, имеет две версии: первая (более старая) версия использует v1.0.0 платформы Restlet, а последняя (более новая) версия использует v2.2.2.
Когда пользователь запрашивает обе версии моей службы с помощью cURL и предоставляет свое имя пользователя и пароль в виде String
в кодировке base64, это работает. Аналогично, обе версии принимают кодированный String
в заголовке Authorization: Basic ...
.
Когда они отличаются, я пытаюсь позвонить в службу, используя HttpURLConnection
. Первый работает, второй нет.
Это общее представление о том, как работает инструмент, который вызывает мой сервис:
final String xx_userid = userid; // userid set above
final String xx_pwd = pwd; // pwd set above
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
xx_userid, xx_pwd.toCharArray());
}
});
// ... some more code ...
URL url = new URL(url_string); // url_string is the endpoint of my service
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("Accept", "text/xml");
Приведенный выше код работает для более старой кодовой базы (то есть я получаю обратно 200 OK
, а также ожидаемый XML-ответ). Однако для новой кодовой базы я получаю 403 Unauthorized
назад.
Вот фрагмент в моей новой кодовой базе, который должен получить имя пользователя и пароль из запроса:
@Override
protected boolean authenticate (Request request, Response response) {
String user = null;
String pass = null;
user = request.getChallengeResponse().getIdentifier();
pass = new String(request.getChallengeResponse().getSecret());
// ... some more code ...
}
И user
, и pass
остаются null
, потому что метод getChallengeResponse()
возвращает ноль.
Кто-нибудь знает, почему этот код работает для v1.0.0 платформы Restlet, но не для v2.2.2? Или мне чего-то не хватает?
Некоторая другая (вероятно, не относящаяся к делу) информация:
- Старая кодовая база:
- Работает в Tomcat v7.0.55
- Размещается на машине RHEL7
- Нет балансировщика нагрузки
- Новая кодовая база:
- Работает в Tomcat v7.0.55
- Размещается на экземпляре EC2 (Amazon Linux AMI)
- Использует балансировщик нагрузки приложений (ALB) Amazon для указания на разные экземпляры EC2
- Балансировщик нагрузки имеет другое доменное имя, чем экземпляры службы
Спасибо заранее. Пожалуйста, дайте мне знать, если есть какая-то дополнительная информация, которую я мог бы предоставить, чтобы упростить отладку.