无法使用|Akka-Http上算子

xzv2uavs  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(128)

我想从查询参数或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?
但由于某种原因,我无法复制。

  • 谢谢-谢谢
kognpnkq

kognpnkq1#

我相信这是因为当参数(“token”.optional)被拒绝时,它会自动返回一个401未经授权的响应。
我认为情况正好相反。您将“token”参数设置为可选,这意味着当它不存在时,它仍然会被接受,并且|后面的指令不会被求值。如果您删除了.optional,并且token参数不存在,它将被拒绝,并且|后面的指令将被求值。

相关问题