我有一个带WSSE身份验证的Web服务。 Web服务是用Symfony2编写的,我可以通过PHP客户端访问它,也可以使用名为REST Console的chrome插件来访问它,因此它可以工作。为了手动生成标题,我使用了this wsse generator。
要制作Android客户端,我已按照此tutorial进行操作,但仅当它不生成时间戳时才有效。
生成时间戳的代码是:
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
...
private String generateTimestamp() {
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
return sdf.format(new Date());
}
它返回的字符串是正确的,格式和一切看起来都很完美,但它告诉“未授权”,但是当我直接写这样的时间戳时它会起作用:
private String generateTimestamp() {
return "2014-03-25T09:00:26Z";
}
我已检查过编码,尝试将其编码为UTF-8和Cp-1252(文件编码):
private String generateTimestamp() {
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String hora = sdf.format(new Date());
String correctString = "fail";
try {
correctString = new String(hora.getBytes(), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
correctString.hashCode();
//String buena = "2014-03-25T08:10:59Z";
return correctString ;
}
我使用Calendar.YEAR + Calendar.MONTH ....生成时间戳,但仍然无效。
目前我正试图在真正的手机中测试它,但我认为这不是模拟器问题。
你有什么建议吗?非常感谢你提前!
答案 0 :(得分:0)
有效的解决方案是:
private String generateTimestamp() {
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String hora = sdf.format(new Date());
return "\""+hora+"\"";
}
问题是Android发送给webservice的最终字符串有两个双引号,如下所示:
X-WSSE: UsernameToken Username="esther", PasswordDigest="FgWu9GAKkbmsc52fZHu3VINHlKw=", Nonce="OWVkNDMxMWY2OGE4MTZjOQ==", Created=""2014-03-25T09:00:26Z""
但它有效,即使它不是最好的解决方案。
我认为Java / Android / SimpleDateFormat如何生成字符串有所不同,但是......
我已经测试了尝试连接空字符串但它仍然不起作用。