我正在使用基本身份验证。如果我的密码包含冒号,我似乎无法进行身份验证。密码中不允许使用冒号吗?我如何进行身份验证:
DefaultHttpClient client = new DefaultHttpClient();
HttpRequestInterceptor preemptiveAuth = new HttpRequestInterceptor() {
...
};
client.addRequestInterceptor(preemptiveAuth, 0);
client.getCredentialsProvider().setCredentials(
new AuthScope("example.com", 443),
new UsernamePasswordCredentials("me", "password:test"));
没有冒号的密码始终有效。带冒号的密码总是失败。在将密码交给UsernamePasswordCredentials类构造函数之前,我是否必须以某种方式转义密码?我知道basicauth使用用冒号分隔的用户名/密码,然后是base64编码,这就是问题所在吗?
由于
----更新------
谢谢大家,是的,我正在与之通信的服务器中出现问题!
答案 0 :(得分:22)
它应该工作。 RFC2617是围绕HTTP身份验证的RFC。规范不对密码中使用的字符设置任何限制,仅限用户名;
要获得授权,客户端会发送用户ID和密码, 在base64 [7]内用单个冒号(“:”)字符分隔 凭证中的编码字符串。
basic-credentials = base64-user-pass
base64-user-pass = <base64 [4] encoding of user-pass,
except not limited to 76 char/line>
user-pass = userid ":" password
userid = *<TEXT excluding ":">
password = *TEXT
答案 1 :(得分:5)
如果服务器在分离Base64“username:password”时存在错误,则身份验证方法将失败。检查您的服务器(可能有可用的更新?使用不同的服务器?),不要在密码中使用冒号,或使用其他身份验证方法。
出于好奇,你想要对哪个服务器进行身份验证?
答案 2 :(得分:1)
我知道这是一个旧帖子,但万一其他人遇到同样的问题:
new UsernamePasswordCredentials("me", "password:test"));
中的代码可能会在每个冒号上拆分字符串。以下是PHP中将失败的示例:
$bits = explode(':',$auth_string);
$user = $bits[0];
$password = $bits[1];
这是一个修复:
$bits = explode(':',$auth_string);
$user = array_shift($bits);
$password = implode(':',$bits);
答案 3 :(得分:0)
密码中出现冒号问题。似乎用户名和密码不会被正确拆分。
示例 user:pass:word
在我的情况下,PHP中提供的密码只是“传递”而不是“传递:字”。
我已经学会了避免使用密码中的特殊字符:(冒号)和@(at)。这有点奇怪,因为在我们更新到php-fpm之前,相同的逻辑工作正常(我不知道这个问题是否属于php-fpm)。