2014-12-11 1 views
2

Play-silhouette-rest 액티베이터 템플리트는 좋은 것을 제공합니다. example HeaderAuthenticator로 REST 인증/등록 사용 방법을 제공합니다. 요청에 기호를 얻기는 사용자를 생성하고 반환 (두 번째 줄에 초기화되고) (첫 번째 줄에 초기화되고)와 헤더에 내가 몸에 동일한 토큰을 얻고이 예에서 모두 응답 본문 및 헤더play2 실루엣에서 JWT 토큰에 도달 JWTAuthenticator

val response = Ok(Json.toJson(Token(token = authenticator.id, expiresOn = authenticator.expirationDate))) 
env.authenticatorService.init(authenticator, Future.successful(response)) 

에 토큰 .

JWTAuthenticator를 사용할 의지가 있으므로 대신 코드를 변경하여 (코드가 동일하고 하나의 차이 만이 종속성 주입 코드 임) 동일한 모양을 기대했습니다.

그러나 JWTAuthenticator authenticator.id를 사용하면 나중에 실제 JSON 웹 토큰이 생성되는 다른 ID가 생성되고 JSON 웹 토큰은 두 번째 코드 줄의 헤더에만 기록됩니다.

응답 본문에 실제 json 웹 토큰을 반환하고 싶지만 같은 방법으로 작성한 후에 헤더를 읽지 않으려합니다.

해결책이 있습니까?

답변

3

유일한 해결책은 응답 대신 요청으로 인증자를 초기화하는 것입니다. Authenticator 서비스에는 두 개의 init 메소드가 포함되어 있기 때문에 가능합니다. 첫 번째는 응답으로 인증자를 초기화 할 수 있고 두 번째는 요청으로 인증자를 초기화 할 수 있습니다.

env.authenticatorService.init(authenticator, request).map { r => 
    r.headers.get("X-Auth-Token") match { 
    case Some(token) => Ok(Json.toJson(Token(token = token, expiresOn = authenticator.expirationDate))) 
    case None => BadRequest("Couldn't generate token") 
    } 
} 

인증자를 초기화하고 생성 된 값을 반환하는 추가 init 메소드를 추가 할 수 있는지 확인합니다. 당신은 이것을 issue 따를 수 있습니다.

+0

답변 해 주셔서 감사합니다. 이 질문 범위에서는 유효 기간 만료 변경을 보관하고 싶지 않지만 request.headers 객체를 사용하지 않고 JSON Web Token을 생성 한 직후 검색하려고합니다. –

+0

아, 네 문제를 안다. 답변을 업데이트했습니다. – akkie

+0

그게 바로 지금이 문제를 해결하기위한 것입니다. 더 편리한 방법이 있다면 좋을 것입니다. 이 질문으로 방황 한 사람들을 위해 - 위의 github 문제를 살펴보십시오. –