使用BASIC身份验证创建会话

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用BASIC身份验证创建会话相关的知识,希望对你有一定的参考价值。

我想写一个servlet,我可以用它来创建一个新的会话。

servlet要求用户使用BASIC authentication进行身份验证并返回标准会话cookie(使用HttpServletRequest#getSession(true))。但是,如果客户端在其下一个请求中使用收到的会话cookie而不是BASIC authentication,则不会对其进行身份验证。服务器识别会话但不包含用户信息。

我正在使用Tomcat,经过一些调试后,原因也很明显:用户信息(Principal)在认证时被添加到会话中。但是,当第一次BASIC身份验证发生时,没有会话存在,因为这将由servlet创建。有谁知道如何解决这个问题?

答案

经过一夜的睡眠[1],我相信自己已经想出了一个有效的解决方案。下面的代码片段(使用JAX-RS,但是将它转换为普通的servlet代码应该不会太难)如果调用客户端将遵循重定向,那么这样做很有用:

public Response getSessionCookie() {
  boolean sessionExists = m_servletRequest.getSession(false) != null;
  if (sessionExists) {
    return Response.noContent().build();
  } else {
    HttpSession session = m_servletRequest.getSession();
    return Response.status(Status.TEMPORARY_REDIRECT)
        .header("Location",
           m_uriInfo.getAbsolutePathBuilder().matrixParam("jsessionid", session.getId()).build())
        .build();
  }
}

第一个请求将创建一个会话并将客户端重定向到相同的地址,但URL中的会话ID(这很重要)。客户端将遵循请求并再次发送相同的BASIC身份验证数据,但现在它将在现有会话中注册。上面方法的第二次调用将返回一个空响应,其中会话cookie现在可用于后续请求。请注意,在第二个响应中,会话cookie对我来说是不同的,但是看看Tomcat代码,这似乎是故意的(成功的身份验证将始终创建一个新的会话)。

[1]睡眠被低估了!

以上是关于使用BASIC身份验证创建会话的主要内容,如果未能解决你的问题,请参考以下文章

使用JAVA请求需要Basic身份验证的网页

没有登录按钮的 Facebook 身份验证

教程4 - 验证和权限

如何在不关闭当前 Firebase 会话的情况下创建用户身份验证 [重复]

错误域 = MCOErrorDomain 代码 = 5 “无法使用当前会话的凭据进行身份验证。”

在 feathersjs 中使用 JWT 进行身份验证和会话处理