带冒号的密码失败基本身份验证?

时间:2010-10-21 18:13:34

标签: java

我正在使用基本身份验证。如果我的密码包含冒号,我似乎无法进行身份验证。密码中不允许使用冒号吗?我如何进行身份验证:

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编码,这就是问题所在吗?

由于

----更新------

谢谢大家,是的,我正在与之通信的服务器中出现问题!

4 个答案:

答案 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)。