我想和一个供应商交换数据。他们想让我获取他们给我的用户名和密码,并在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个字节?
4条答案
按热度按时间llew8vvj1#
问题是由填充引起的。我仍然不明白确切的原因,但我编码的字符串是49字节长,这不是平均除以3,这意味着填充开始发挥作用。
当我将代码更改为以下内容时:
然后运行它,我得到了相同的字符串减去base64最后用作填充字符的2==。发送到服务器得到了我想要的答案。
为什么他们称之为软件当它是如此之难?
a64a0gku2#
Tg==
是base64吗N
.TiA=
是base64吗N
(例如,n,然后是空格)。哦,听起来 Postman 在上面贴了个空位,而你没有。希望,如果您在base64编码的末尾添加一个空格,您将得到与postman提供的字符串完全相同的字符串,并且希望,在这一点上一切都会成功:)
m1m5dgzv3#
Postman 使用utf-8进行基本身份验证编码,从https://github.com/postmanlabs/postman-app-support/issues/4070
像这样更改代码
https://www.base64encode.org/ 测试用
xoefb8l84#
尊敬的开发人员,他们不是在oauth2上运行吗?如果是这样,请使用下面的代码块并杀死它
让我知道如果你面临任何挑战,那么我们可以一起做