В следующем Controller
, Authenticated
извлекает токен из заголовков запроса и вызывает данное действие тогда и только тогда, когда токен действителен (для ясности код был упрощен):Play Framework: как добавить заголовок для каждого ответа
object MyController extends Controller {
def Authenticated(action: Token => EssentialAction) = EssentialAction { requestHeader =>
val jwt = requestHeader.headers.get(HeaderNames.AUTHORIZATION) match {
case Some(header) => s"""$AuthScheme (.*)""".r.unapplySeq(header).map(_.head.trim)
case _ => requestHeader.getQueryString("auth").map(UriEncoding.decodePath(_, SC.US_ASCII.name))
}
jwt match {
case Some(t) if t.isValid =>
val token: Token = authService.token(t)
action(token)(requestHeader)
case _ => Done(Unauthorized.withHeaders(HeaderNames.WWW_AUTHENTICATE -> AuthScheme))
}
}
def getUser(userId: String) = Authenticated { token =>
Action.async { request =>
userService.find(userId).map {
case Some(user) => Ok(Json.obj("user" -> user.asJson)).withHeaders(
"token" -> authService.renew(token).asJson.toString
)
case _ => NotFound
}
}
}
}
токен, возвращаемый authService.token(t)
является JWT (JSON веб-токен), и он может быть использован только один раз ... так что мне нужно, чтобы вернуть новый маркер после каждого запроса. Идея заключалась бы в том, чтобы поместить новый токен в заголовки ответов. Тем не менее, есть ли способ добавить заголовок token
для каждого ответа без необходимости вызывать withHeader
в каждом действии?