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



我有一个想要交换数据的供应商。他们希望我接受他们给我的用户名和密码,并将其用于获取请求的授权标头。

现在是我肮脏的小秘密。我以前从未创建过授权标头。

所以我做了大量的研究,找出了下面的代码。

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);
}

我运行了它,但没有得到回复。嗯。所以我去和他们一起打开一个支持请求,我想创建一个示例,所以我打开poster,并使用他们为poster提供的API。首先,我为我正在复制的API运行一个,它有效。嗯。

因此,我修改了API,并使用我的用户名和密码,而不是示例中包含的那个,它运行良好。Crikey!

所以我稍作改动,注意到poster创建的auth中的Base64字符串在末尾与我创建的字符串略有不同。

所以,回到研究中,我发现的所有代码看起来都很像我的,尽管由于版本差异,我不得不对其进行一些更新。绳子仍然不一样,现在我正在寻求帮助。肯定有人解决了这个问题。

来自邮递员的字符串";基本THVKZ。。。FvTg==";上面代码中的字符串";基本THVKZ。。。FvTiA=";

我怎么做错了什么,结果只差了三个字节?

Tg==N的base64。

TiA=N的base64(如在N中,然后是一个空间(。

Sooo,听起来好像邮递员在上面贴了一个空位,而你没有。希望,如果你在base64编码的最后添加一个空格,你应该得到与poster给你的字符串完全相同的字符串,希望,到那时一切都会成功:(

Postman使用UTF-8进行基本身份验证编码,请从https://github.com/postmanlabs/postman-app-support/issues/4070

像这个一样更改代码

secretKey.getBytes(StandardCharsets.UTF_8);

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

问题是由填充引起的。我仍然不明白为什么,但我编码的字符串有49个字节长,不能被3整除,这意味着填充开始发挥作用。

当我将代码更改为以下代码时:

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

然后运行它,我得到了相同的字符串减去base64用作填充字符的末尾的两个==。把它发送到服务器得到了我想要的答案。

为什么他们称它为软件,而它却如此困难?

Estemed开发人员,他们不是在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();
}

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

最新更新