Jetty 12.0.x SPNEGO: задавайте ім'я служби, а не повний principal
Розділяйте proxy URI, користувача JAAS і компонент служби GSS під час налаштування автентифікації Jetty 12.
У конфігурації Jetty SPNEGO є три імені: URI, що використовується для зіставлення автентифікації, користувач, який входить через JAAS, і служба, для якої запитується квиток. Вони мають різне призначення.
Для реалізації Jetty 12.0.x фрагмент об'єкта автентифікації виглядає так:
var auth = new org.eclipse.jetty.client.SPNEGOAuthentication(
java.net.URI.create("http://proxy.example:8080"));
auth.setServiceName("HTTP");Цей фрагмент ілюструє компонент служби, а не повний рецепт автентифікації через proxy. Вхід через JAAS, маршрутизація proxy і обмін автентифікації запиту залишаються окремими.
У цій реалізації Jetty будує GSS-ім'я на основі хоста, поєднуючи getServiceName(), символ @ і хост для обміну автентифікації. Якщо передати [email protected] як компонент служби, буде додано ще один хост. Читайте контракт цього setter, а не припускайте, що він приймає повний principal Kerberos.
Отримане GSS-ім'я має концептуальну форму HTTP@hostname. Відповідний principal служби в KDC зазвичай подається як HTTP/hostname. вибране ім'я proxy має збігатися зі службою, фактично зареєстрованою для цього облікового запису; IP-адреса або псевдонім можуть вибрати іншу ціль квитка.
Перевірте також шлях 407
У Jetty 12.0.x authenticate() отримує GSS-ім'я хоста з request.getHost() і будує результат із заголовком Authorization за замовчуванням. Зіставлення об'єкта автентифікації за proxy URI саме собою не змінює цей вибір на ім'я хоста proxy і Proxy-Authorization.
Тому інтеграції з proxy потрібен правильний хост запиту й результат в області proxy для цього обміну. Запит HTTPS CONNECT і звичайний запит до джерела можуть мати різні значення хоста. Перевірте поведінку встановленої реалізації, а не припускайте, що setter імені служби забезпечує весь потік 407.
Для 407 перевірте обмін автентифікації proxy і хост, використаний цим запитом. 401 стосується автентифікації джерела. Лише дійсний квиток користувача не доводить, що Jetty запросив правильний квиток служби або що посередник його прийняв.