在 Play Framework 中出现 "Login Untried" 错误

Getting a "Login Untried" Error in Play Framework

我在尝试使用身份验证访问 Rest API 时遇到未经尝试的登录。我在 Lagom 中使用 WS Play。登录请求类似于:

val reqLogin = ws.url(loginURL)
  .withAuth(userName, password, WSAuthScheme.BASIC)
  .execute()

来自后续查询的消息是 401 未经授权的错误。以下是我在上述登录尝试后尝试查询的方式:

val loginResponse = Await.result(reqLogin, Duration(60, "seconds"))
val cookies = loginResponse.cookies
val queryResponse = ws.url(queryURL)
    .withCookies(cookies.toSeq :_*)
    .execute()
val queryResponseOutput = Await.result(queryResponse, Duration(60, "seconds"))

在第一个请求中,您使用 HTTP Basic authentication 登录。您使用的站点是否支持 HTTP 基本身份验证?通常,当站点支持它时,它不会向您发送 cookie,而是希望在每次请求时都发送登录凭据。所以,在使用HTTP基本认证时,应该不需要在登录URL处登录,而是在请求中添加用户名和密码到queryUrl。如果这不起作用,则可能意味着您发出请求的网站不支持 HTTP 基本身份验证。

另一种登录方式是在登录表单中提交用户名和密码,然后您正在登录的站点将向您发回一个 cookie,您可以将其用于后续请求。这似乎是你想要做的,但要做到这一点,你不能使用 withAuth 方法,而是必须找出站点登录中的 username/password 参数是什么表单,并发送包含这些参数集的表单。我无法告诉您这些参数是什么,这完全取决于您登录的站点,您必须查看该站点的文档,或者查看它在登录时输出的 HTML页。当您返回对登录请求的响应时,您应该检查响应代码以查看它是否成功。可以找到有关如何使用 Play WS 提交表单参数的文档 here,下面是它可能看起来像的示例:

val reqLogin = ws.url(loginURL)
  .post(Map(
    "yourusernameparameter" -> Seq(userName),
    "yourpasswordparameter" -> Seq(password)
  ))

为了清楚起见,需要将上面的 yourusernameparameteryourpasswordparameter 字段替换为您登录的站点需要的任何内容。您可能还需要输入 CSRF 令牌。