1

저는 Restlets "ChallengeResponse"메커니즘을 사용하여 서버 측에서 사용자를 인증했습니다.Restlet에서 url의 기본 인증

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:[email protected]/my_secure_document 

실제로 전송 된 것을 보았을 때, 그것은 암호처럼 보인다는 클라이언트가 외부 웹 서비스입니다 Base64로

인코딩되고있는 (Twilio)는 헤더 대신 URL을 통해 인증 정보를 전송합니다 ....

Restlet을 사용하여 이러한 방식으로 인증하는 올바른 방법은 무엇입니까?

답변

2

위에서 작성한 코드는 서버쪽에있는 것처럼 보입니다.

귀하의 질문은 클라이언트에서이 URI를 사용하는 것입니다 (그리고 클라이언트가 Restlet을 사용한다고 가정 함). 당신은 참조를 구축하고 다음과 같이 Reference.getUserInfo()를 사용하여 사용자 이름과 암호를 추출 할 수 있습니다 :

Reference ref = new Reference("https://username:[email protected]/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(); 

(. 물론, 당신은 사용자 정보가 분할 전에 널인지 테스트해야합니다)

+0

을 미안해, 좀 더 구체적이어야 했어. 이 코드는 서버 측에 있지만 클라이언트는 머리글 대신 URL을 통해 인증 정보를 보내는 외부 웹 서비스 (Twilio)입니다. –

+0

아 좋아. 이 경우 실제로 URL을 통해 보내지는 않으며 단지 표기법입니다. 클라이언트는이를 자동으로 헤더에 넣습니다. 그냥 점점 http://example.com/test처럼 명확히하는 것은 사실이 전송 : GET/테스트 HTTP/1.1 호스트 : example.com 사용자 이름 : 암호가 자동으로 적절한 HTTP 헤더로 변환된다 , 적절한 경우 (내가 Restlet 목록에서 말했듯이, 보안상의 이유로 일부 브라우저에서는이 기능을 사용할 수 없습니다). 이 경우의 동작은 클라이언트에 의해 전적으로 제어됩니다. 전체 요청을 로깅하여 전송 한 내용을 볼 가치가 있습니다. – Bruno

+1

비밀 번호는 콜론을 포함 할 수 있으므로'ref.getUserInfo(). split (":", 2)'를 생각해보십시오. (그건 내 생각이 아니었고 편집시 제안 된 것입니다. 그것을 위해). –