我一直在使用Restlets“ChallengeResponse”机制来验证服务器端的用户。
ChallengeResponse challengeResponse = getRequest().getChallengeResponse();
if( challengeResponse == null ){
throw new RuntimeException("not authenticated");
}
String login = challengeResponse.getIdentifier();
String password = new String(challengeResponse.getSecret());
根据我的理解,“ChallengeResponse”要求将用户名和密码放入标题中。但是,客户端需要将凭据放入URL中,如下所示:
https://username:password@www.myserver.com/my_secure_document
当我查看实际发送的内容时,看起来密码是Base64编码的
客户端是外部Web服务(Twilio),它通过URL而不是标题发送身份验证信息....
使用Restlet以这种方式进行身份验证的正确方法是什么?
答案 0 :(得分:2)
您上面的代码片段看起来就像在服务器端。
我认为你的问题是关于从客户端使用这个URI(我还假设你的客户端使用Restlet)。您可以使用Reference.getUserInfo()构建引用并提取用户名和密码,如下所示:
Reference ref = new Reference("https://username:password@www.myserver.com/my_secure_document");
String[] userinfo = ref.getUserInfo().split(":"); // "username:password"
String username = userinfo[0];
String password = userinfo[1];
ClientResource clientRes = new ClientResource(ref);
clientRes.setChallengeResponse(ChallengeScheme.HTTP_BASIC, username, password);
clientRes.get();
(当然,在拆分之前,您需要测试用户信息是否为空。)