我想从查询参数或Authorization标头中提取一个标记。
为此,我创建了以下指令:
(parameter("token".optional) | optionalHeaderValueByName("Authorization")).flatMap { _ match {
case Some(token) =>
// authenticate it
complete(...)
case None =>
reject(AuthenticationFailedRejection)
}
}
问题是带有“token”查询参数的请求可以工作,但带有“Authorization”头(没有查询参数)的请求不能工作。optionalHeaderValueByName
将被跳过。
我 * 相信 * 这是因为当parameter("token".optional)
被拒绝时,它会自动返回一个401 Unauthorized
响应。
如果确实是这样,有没有办法让它也检查optionalHeaderValueByName
?
我认为|
运算符就是为此而设计的。
也许它在返回路由时有效?而在flatMap
ping时无效?
这篇文章涵盖了相同的使用情形:How do I use two Directives with OR in Akka-HTTP?
但由于某种原因,我无法复制。
- 谢谢-谢谢
1条答案
按热度按时间kognpnkq1#
我相信这是因为当参数(“token”.optional)被拒绝时,它会自动返回一个401未经授权的响应。
我认为情况正好相反。您将“token”参数设置为可选,这意味着当它不存在时,它仍然会被接受,并且
|
后面的指令不会被求值。如果您删除了.optional
,并且token
参数不存在,它将被拒绝,并且|
后面的指令将被求值。