Base64编码异常,并具有泽西artion客户的基本身份验证



我有一个在Wildfly 9上运行的泽西arter端,并启用了基本身份验证。这通常可以很好地工作,但是当使用具有特殊字符的密码(例如德语Umlauts)时,我会得到此例外,与Base64编码有关:

Caused by: java.lang.ArrayIndexOutOfBoundsException: 255
        at org.glassfish.jersey.internal.util.Base64.encode(Base64.java:112)
        at org.glassfish.jersey.internal.util.Base64.encodeAsString(Base64.java:160)
        at org.glassfish.jersey.client.filter.HttpBasicAuthFilter.<init>(HttpBasicAuthFilter.java:98)
        at org.glassfish.jersey.client.filter.HttpBasicAuthFilter.<init>(HttpBasicAuthFilter.java:72)

知道我可能做错了什么?

这是一个已知的错误。

作为解决方法,您可以直接设置Authorization标头,而不是使用HttpAuthenticationFeature.HTTP_AUTHENTICATION_BASIC_USERNAMEHttpAuthenticationFeature.HTTP_AUTHENTICATION_BASIC_PASSWORD属性。

旧代码:

Invocation.Builder builder = …;
builder
    .property(HttpAuthenticationFeature.HTTP_AUTHENTICATION_BASIC_USERNAME, username)
    .property(HttpAuthenticationFeature.HTTP_AUTHENTICATION_BASIC_PASSWORD, password);

新代码:

import java.nio.charset.StandardCharsets;
import java.util.Base64;
import javax.ws.rs.core.HttpHeaders;
// …
    builder.header(HttpHeaders.AUTHORIZATION, calculateAuthentication(username, password));
// …
private String calculateAuthentication(final String username, final byte[] password) {
    final byte[] prefix = (username + ":").getBytes(StandardCharsets.UTF_8);
    final byte[] usernamePassword = new byte[prefix.length + password.length];
    System.arraycopy(prefix, 0, usernamePassword, 0, prefix.length);
    System.arraycopy(password, 0, usernamePassword, prefix.length, password.length);
    return "Basic " + Base64.getEncoder().encodeToString(usernamePassword);
}

最新更新