在授权密码中包含特殊字符的用户时遇到问题。我已经尝试了几种选择,而且我对它们中的任何一种都不是很满意。代码是这样的(全部是UTF-8):
var user = 'myuser';
var password = 'ºººººº';
var Iconv = require('iconv').Iconv;
var iconv = new Iconv('latin1', 'utf-8');
//password = iconv.convert(password).toString();
var request = require('request');
var options = {
uri: 'http://myhost/auth',
auth: {
user: user,
pass: password
}
};
request.get(options, function(err, resp, body) {
if (err) {
console.error('Error %j', err);
} else if (resp.statusCode !== 200) {
console.error('Error, status code %d', resp.statusCode);
} else {
console.log('Success!');
}
});
console.log('Password length is %d bytes', Buffer.byteLength(password));
这是回归:
Password length is 12 bytes
Error, status code 401
当我取消注释编码转换(第5行)时,我得到:
Password length is 24 bytes
Success!
但我不明白为什么我需要转换为" latin1"当密码已经是UTF-8时,到" utf8"当我将整个文件转换为ISO-8859-15时,我得到(有和没有转换):
Password length is 18 bytes
Error, status code 401
和
Password length is 36 bytes
Error, status code 401
我也尝试过(结果相同):
request.get("http://" + user + ":" + password + "@myhost/auth", ...
和
var options = {
uri: 'http://myhost/auth',
auth: user' + ':' + password
};
但这可行(无转换):
var options = {
url: 'http://myhost/auth',
headers: {
'Authorization': 'Basic ' + new Buffer(user + ':' + password).toString('base64')
}
};
我想在没有来自" latin1"的丑陋转换的情况下进行授权。到" utf8"那缓冲区处理可能吗?