407 lặp lại không phải lúc nào cũng có nghĩa Java đã gửi sai mật khẩu. Bản triển khai tham chiếu của JDK thường tắt xác thực Basic cho đường hầm HTTPS CONNECT. Proxy chỉ cung cấp Basic có thể bị từ chối trước khi callback xác thực của bạn cung cấp thông tin đăng nhập.

Giới hạn phạm vi callback cung cấp thông tin đăng nhập

Gắn Authenticator vào máy khách HTTP Java và giới hạn nó cho proxy đã cấu hình:

String proxyHost = "203.0.113.10";
int proxyPort = 8080;
String password = System.getenv("PROXY_PASSWORD");
if (password == null) {
    throw new IllegalStateException("Set PROXY_PASSWORD");
}

java.net.Authenticator auth = new java.net.Authenticator() {
    @Override
    protected java.net.PasswordAuthentication getPasswordAuthentication() {
        if (getRequestorType() == RequestorType.PROXY
                && proxyHost.equals(getRequestingHost())
                && proxyPort == getRequestingPort()) {
            return new java.net.PasswordAuthentication(
                "proxy-user", password.toCharArray());
        }
        return null;
    }
};

java.net.http.HttpClient client = java.net.http.HttpClient.newBuilder()
    .proxy(java.net.ProxySelector.of(
        new java.net.InetSocketAddress(proxyHost, proxyPort)))
    .authenticator(auth)
    .connectTimeout(java.time.Duration.ofSeconds(5))
    .build();

Đây là mã thiết lập cho một máy khách, không phải bộ xác thực mặc định toàn cục. Thay địa chỉ dùng trong tài liệu và sử dụng thông tin đăng nhập thực sự được cấp cho dịch vụ đó. Việc kiểm tra loại bên yêu cầu và điểm cuối ngăn cùng callback đó vô tình cung cấp tài khoản proxy khi gặp yêu cầu xác thực từ một trang web.

Kiểm tra bước xác thực nào đang thất bại

JDK có các thiết lập lược đồ bị tắt riêng cho HTTP thông thường qua proxy và cho đường hầm CONNECT. Các tên liên quan là jdk.http.auth.proxying.disabledSchemes và jdk.http.auth.tunneling.disabledSchemes.

Điều này giải thích tại sao lưu lượng HTTP có thể xác thực thành công nhưng đường hầm HTTPS qua cùng proxy lại thất bại. Kiểm tra conf/net.properties của môi trường chạy và chính sách triển khai, thay vì cho rằng máy khác có cùng giá trị mặc định đang có hiệu lực.

Xóa rỗng danh sách lược đồ bị tắt trên toàn cục không phải cách sửa proxy chung. Thông tin đăng nhập Basic gửi đến proxy HTTP dạng văn bản rõ không được bảo vệ bởi kết nối TLS với đích được tạo sau đó. Xem xét giao thức vận chuyển đến proxy, phương thức xác thực và chính sách triển khai trước khi phê duyệt thay đổi.

Hành vi xác thực tích hợp được ghi trong tài liệu JDK cũng không hứa hỗ trợ mọi lược đồ mà proxy công bố. Header Authorization hoặc Proxy-Authorization được cung cấp thủ công làm thay đổi luồng của bộ xác thực tự động, vì vậy hãy kiểm tra header tùy chỉnh khi callback hoạt động khác ví dụ.

Bài viết liên quan