我正在通过读取请求标头使用动作组合来进行api授权。我想在响应头上注入身份验证令牌,以便客户端可以使用它在连续调用时调用API。到目前为止,我已经使用动作组合拦截了请求,我可以在获取控制器代码之前设置响应头,还是只能在控制器代码上完成?
可以在invokeBlock下面注入响应头吗?
def invokeBlock[A](request: Request[A], block: AuthorizedRequest[A] => Future[Result]): Future[Result] = {
val requestToken = sessionTokenPair(request)
requestToken match {
case Some(token) => {
AuthenticationManager.validateAPIToken(token).map { sh =>
block(new AuthorizedRequest(sh, request))
}.getOrElse{
Future.successful(Forbidden(Json.toJson(
Error(status = Status.FORBIDDEN,errorCode = 43, message = "Bad Request",developerMessage="Issue")
)))
}
}
case _ => {
Future.successful(Forbidden(Json.toJson(
Error(status = Status.FORBIDDEN,errorCode = 43, message = "Bad Request",developerMessage="Issue")
)))
}}
}
}`enter code here`
答案 0 :(得分:0)
是的,invokeBlock
是一个很好的地方 - 当然不需要在每个控制器中重复自己。
在你的“成功”案例中,你有:
block(new AuthorizedRequest(sh, request))
您实际上正在返回Future[Result]
给您的block()
。
要添加额外的标头,只需map
Future
,然后使用handy methods on Result
添加:
block(new AuthorizedRequest(sh, request)).map { result =>
result.withHeaders(
"x-foo" -> "f00",
"x-bar" -> "bar")
}