2014-12-11 3 views
2

Шаблон активатора для воспроизведения-силуэта-отдыха дает хорошее example как использовать аутентификацию REST/зарегистрироваться с помощью HeaderAuthenticator. Получение знака в запросе он создает пользователя и возвращает маркер в обоих теле ответа и заголовкаДостижение JWT-токена в play2-силуэте 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 генерируется позже), а JNON Web Token записывается только в заголовке, во второй строке кода.

Я готов вернуть реальный токен json в тело ответа, но не хочу читать заголовки после того, как я написал в них тем же методом.

Есть ли решение?

ответ

3

Единственное решение, которое я вижу, - это инициализировать аутентификатор с запросом вместо ответа. Это возможно, потому что служба аутентификатора содержит два метода 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

Спасибо за ответ. В этом вопросе я не хочу архивировать изменение таймаута истечения срока действия, но я хочу получить JSON Web Token сразу после его создания без беспорядка с объектом request.headers. –

+0

А, я вижу твою проблему. Я обновил ответ. – akkie

+0

Вот что я делаю прямо сейчас, чтобы решить эту проблему. Было бы здорово иметь более удобный способ. Для тех, кто бродил по этому вопросу - взгляните на вопрос github выше. –

Смежные вопросы