2010-01-13 24 views
9

tôi đang làm một số xác thực HTTP đơn giản và nhận được mộtJava: lấy URL với HTTPBasic Xác thực

java.lang.IllegalArgumentException: Illegal character(s) in message header value: Basic OGU0ZTc5ODBk(...trimmed from 76 chars...) 
(...more password data...) 

mà tôi nghĩ là do tôi có một tên người dùng và mật khẩu rất dài và bộ mã hóa kết thúc tốt đẹp nó với một \n tại 76 ký tự. Có cách nào tôi có thể vượt qua chuyện này không? URL chỉ hỗ trợ Xác thực cơ bản HTTP.

Đây là mã của tôi:

private class UserPassAuthenticator extends Authenticator { 
    String user; 
    String pass; 
    public UserPassAuthenticator(String user, String pass) { 
     this.user = user; 
     this.pass = pass; 
    } 

    // This method is called when a password-protected URL is accessed 
    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(user, pass.toCharArray()); 
    } 
} 

private String fetch(StoreAccount account, String path) throws IOException { 
    Authenticator.setDefault(new UserPassAuthenticator(account.getCredentials().getLogin(), account.getCredentials().getPassword())); 

    URL url = new URL("https", account.getStoreUrl().replace("http://", ""), path); 
    System.out.println(url); 

    URLConnection urlConn = url.openConnection(); 
    Object o = urlConn.getContent(); 
    if (!(o instanceof String)) 
     throw new IOException("Wrong Content-Type on " + url.toString()); 

    // Remove the authenticator back to the default 
    Authenticator.setDefault(null); 
    return (String) o; 
} 
+0

Thông báo an ninh: nếu tên sử dụng và mật khẩu thông qua HTTP, cả hai mọi thứ được gửi dưới dạng chuỗi rõ ràng. Tốt hơn là sử dụng xác thực khác nhau (biểu mẫu, POST) và giao thức truyền tải (HTTPS, H2). – tfb785

Trả lời

17

Đó có vẻ là một bug in Java.

Bạn đã thử sử dụng các ứng dụng HTTP thay thế, chẳng hạn như thư viện từ Apache chưa?

Hoặc thay vì sử dụng Authenticator, hãy đặt tiêu đề theo cách thủ công?

URL url = new URL("http://www.example.com/"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestProperty("Authorization", "Basic OGU0ZTc5ODBkABcde...."); 

Giá trị mã thông báo là encodeBase64 ("tên người dùng: mật khẩu").

+8

Hoạt động tuyệt vời miễn là tôi thực hiện sửa lỗi từ bài đăng lỗi của bạn. \t \t 'Chuỗi mã hóa = new sun.misc.BASE64Encoder(). Encode (userpass.getBytes()); \t \t // Lỗi Java: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6459815 \t \t encoding = encoding.replaceAll ("\ n", ""); '. Cảm ơn –

+1

Mật khẩu 64 ký tự vẫn không thành công đối với tôi khi xác thực đối với API REST Atlassian (như Bamboo). Thay thế dòng mới là không đủ trong trường hợp của tôi. Groovy HTTPBuilder và AHC xử lý chính xác mật khẩu dài. –

+0

Cảm ơn, Oracle vì đã lãng phí 30 phút thời gian của tôi với sự ngu ngốc này. (Trả lời được tán thành, cảm ơn chân thành) – cbmanica

1

Điều này phù hợp với tôi.

HttpsURLKết nối con = null; con = (HttpsURLConnection) obj.openConnection(); Mã hóa chuỗi = Base64.getEncoder(). EncodeToString ("tên người dùng: mật khẩu" .getBytes (StandardCharsets.UTF_8)); con.setRequestProperty ("Ủy quyền", "Cơ bản" + mã hóa.replaceTất cả ("\ n", ""));

0

tôi thấy rằng các ký tự không hợp là do "Authorization: Basic", mã hóa mà cần được "ủy quyền", "cơ bản" + mã hóa