[英]Akka Authentication with REST Http
我正在使用Akka Basic身份验证和scala测试Json HTTP路由。 但是路线无法按需运行。 这是代码
首先,安全路由不适用于邮递员BasicAuth。 我需要添加电子邮件“ secured/test@test.com”以触发登录操作。 其次,子路由篮筐角色根本不起作用。 邮差说未知路线。 那么,如何使用Postman BasicAuth Http标头来实现此目的? 我必须只发送“安全的”或带有电子邮件和密码的请求。第二,如何使子路由basketActor / add工作。
~ Route.seal {
(pathPrefix("secured") & get) {
authenticateBasic(realm = "secure site", myUserPassAuthenticator) { email =>
path(Segment) { segment =>
var user = User.USER_LIST.find(_.id == segment)
if (user.isDefined)
complete(s"Hi '$email' you logged in")
else complete(s"login failed Please register at ${"users" / "register"}")
}
} ~ path("basketActor") {
(pathEnd & get) {
implicit val timeout = Timeout(3 seconds)
onSuccess((basketActor ? GetBasketProducts).mapTo[BasketList]) { res =>
complete(BasketContainer(products = res.products))
}
} ~ (path("add" / IntNumber) & post) { number =>
val product = Product.PRODUCT_LIST.find(_.id == number)
if (product.isDefined) {
product.foreach { product =>
basketActor ! AddProductToBasket(product)
// complete(Basket.BASKET_LIST ::= product)
}
complete(product)
} else complete("Not found")
}
}
}
}
def myUserPassAuthenticator(credentials: Credentials): Option[String] =
credentials match {
case p@Credentials.Provided(id) if p.verify("secret") => Some(id)
case _ => None
}
因此,我的预期结果应该是用户调用安全的Route登录,然后他可以访问basketActor路由。 但是现在该路由不可访问,安全路由也无法正常工作
这是Akka HTTP中基本身份验证的工作方式:
HTTP请求中的Authorization
标头用于基本身份验证,它包含使用base64
编码编码的用户名和密码。 authenticateBasic
路由将从标头中提取此信息以创建Credentials
对象,然后将其传递给myUserPassAuthenticator
方法。 此方法应检查用户名和密码是否匹配,如果成功,则应返回代表您系统中该用户的对象,或者在失败时返回None
。
authenticateBasic
的第二个(咖喱的)参数是一个获取用户数据并返回Route
的函数。 因此,在您的情况下, email
参数将包含myUserPassAuthenticator
返回的id
值。 此函数应返回包含所有需要身份验证的路径的路由。
重要的是要意识到,没有使用基本身份验证“登录”的概念。 只有正确或不正确的身份验证凭据。 (如果要具有登录/注销语义,则需要转到基于令牌的身份验证机制)。
因此,要使路由正常工作,您需要将查找用户ID的逻辑移到myUserPassAuthenticator
并返回user
对象作为结果。 碰巧的是,您可以只返回find
的结果,因为它已经返回了Option[User]
。
您还需要确保所有经过身份验证的路由都在authenticateBasic
路由内。 当前, basketActor
和add
路由处于同一级别,因此未通过身份验证。
示例路线如下所示。 我使用concat
而不是~
因为我认为它更清楚。
pathPrefix("secured") {
authenticateBasic(realm = "secure site", myUserPassAuthenticator) { user =>
concat(
(pathEnd | pathSingleSlash) {
get {
complete(s"User $user Authenticated OK")
}
},
path("basketActor") {
(pathEnd & get) {
complete(s"basketActor for $user")
}
},
path("add" / IntNumber) { number =>
post {
complete(s"User $user posted $number")
}
}
)
}
}
请注意,用户ID(电子邮件地址)不在URL中,而是在Basic Authentication
标头中的请求中。
为了检验这一与邮差你需要去创建一个GET
与URL .../secured
或.../secured/basketActor
,或POST
与URL .../secured/add/1
。 在“ Basic Authentication
Auth
选项卡下,您需要选择“ Basic Authentication
并在其中添加凭据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.