基本身份验证授权头和基64编码

mklgxw1f  于 2021-07-03  发布在  Java
关注(0)|答案(4)|浏览(469)

我想和一个供应商交换数据。他们想让我获取他们给我的用户名和密码,并在get请求的授权头上使用它。
现在是我肮脏的小秘密。我以前从未创建过授权标头。
所以我做了大量的研究,找出了下面的代码。

public static final String          AUTH_SEPARATOR = ":";
private static final String         AUTH_TYPE = "Basic ";
public static final String          HEADER_AUTHORIZATION = "Authorization";

public static void addAuthHeader(Map<String, String> headers, String user, String password) {
    String secretKey = user
            + AUTH_SEPARATOR
            + password;
    byte[] tokenBytes = secretKey.getBytes();
    String token64 = Base64.getEncoder().encodeToString(tokenBytes);
    String auth = AUTH_TYPE + token64;
    headers.put(HEADER_AUTHORIZATION, auth);
}

我运行它却没有得到回应。嗯,我去和他们一起打开一个支持请求,我想创建一个例子,所以我打开postman并使用他们给我的postman的api。首先,我为正在复制的api运行一个,它可以工作。隐马尔可夫模型。
因此,我修改了这个api,并使用我的用户名和密码,而不是示例中包含的用户名和密码,它可以正常工作。天哪!
因此,我仔细研究了一下,发现postman创建的auth中的base64字符串在结尾与我创建的略有不同。
所以,回到研究中,我发现的所有代码看起来都很像我的代码,尽管由于版本差异,我不得不对其进行一些更新。弦还是不同的,现在我请求帮助。肯定有人解决了这个问题。
来自 Postman 的字符串“基本thvkz…fvtg=”来自上面代码的字符串“基本thvkz…fvtia=”
我怎么会做错了事,结果只差了3个字节?

llew8vvj

llew8vvj1#

问题是由填充引起的。我仍然不明白确切的原因,但我编码的字符串是49字节长,这不是平均除以3,这意味着填充开始发挥作用。
当我将代码更改为以下内容时:

String token64 = Base64.getEncoder().withoutPadding().encodeToString(tokenBytes);

然后运行它,我得到了相同的字符串减去base64最后用作填充字符的2==。发送到服务器得到了我想要的答案。
为什么他们称之为软件当它是如此之难?

a64a0gku

a64a0gku2#

Tg== 是base64吗 N . TiA= 是base64吗 N (例如,n,然后是空格)。
哦,听起来 Postman 在上面贴了个空位,而你没有。希望,如果您在base64编码的末尾添加一个空格,您将得到与postman提供的字符串完全相同的字符串,并且希望,在这一点上一切都会成功:)

m1m5dgzv

m1m5dgzv3#

Postman 使用utf-8进行基本身份验证编码,从https://github.com/postmanlabs/postman-app-support/issues/4070
像这样更改代码

secretKey.getBytes(StandardCharsets.UTF_8);

https://www.base64encode.org/ 测试用

xoefb8l8

xoefb8l84#

尊敬的开发人员,他们不是在oauth2上运行吗?如果是这样,请使用下面的代码块并杀死它

public HttpHeaders getHeaders() {
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        headers.add("Authorization", "Bearer " + token you are either generating or getting from Eureka discovery service);
        return headers;
    }

    AuthResponseObjectType getAuthorization() {
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        String auth = basicAuthUsername + ":" + basicAuthPassword;
        byte[] encodedAuth = org.apache.commons.net.util.Base64.encodeBase64(auth.getBytes(StandardCharsets.US_ASCII));
        headers.add("Authorization", "Basic " + new String(encodedAuth));

        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
        map.add("grant_type", grantType);
        map.add("username", username);
        map.add("password", password);
        map.add("scope", scope);

        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
        return restTemplate.exchange(authUrl, HttpMethod.POST, request, AuthResponseObjectType.class).getBody();

    }

让我知道如果你面临任何挑战,那么我们可以一起做

相关问题