Java Restlet中url的基本身份验证

Java Restlet中url的基本身份验证,java,authentication,restlet,basic-authentication,url-encoding,Java,Authentication,Restlet,Basic Authentication,Url Encoding,我一直在使用Restlets的“ChallengeResponse”机制对服务器端的用户进行身份验证 ChallengeResponse challengeResponse = getRequest().getChallengeResponse(); if( challengeResponse == null ){ throw new RuntimeException("not authenticated"); } String login = challengeResponse.ge

我一直在使用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以这种方式进行身份验证的正确方法是什么?

您上面放置的代码片段看起来像是在服务器端

ChallengeResponse challengeResponse = getRequest().getChallengeResponse();
if( challengeResponse == null ){
     throw new RuntimeException("not authenticated");
}
String login = challengeResponse.getIdentifier();
String password = new String(challengeResponse.getSecret());
我假定您的问题是关于从客户端使用这个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();

(当然,在拆分之前,您需要测试用户信息是否为空。)

对不起,我应该更具体一些。代码在服务器端,但客户端是一个外部web服务(Twilio),它通过URL而不是头发送身份验证信息。啊,好的。在这种情况下,它实际上不是通过URL发送的,它只是一个符号。客户端将自动将其放入标题中。为了澄清这一点,正如getting发送的一样,事实上:GET/test HTTP/1.1 Host:example.com用户名:密码也会在适当的时候自动转换为适当的HTTP头(正如我在Restlet列表中所说的,出于安全原因,某些浏览器会禁用此功能)。这种情况下的行为完全由客户控制。可能需要记录完整的请求来查看它发送的内容。因为密码本身可能包含冒号,请考虑<代码>参考文件GETUSERIN()。拆分(“:”,2)< /代码>(这不是我的想法,它是在编辑中提出的,我只是认为它是错误的地方)。