在 HttpServletRequest.login() 之后获取授权令牌

Get authorisation token after HttpServletRequest.login()

在我们的网络应用程序中,我们需要在成功登录后将身份验证令牌 (LtpaToken2 (websphere), JSESSIONID(tomcat)) 存储在外部数据存储中。我希望在登录 HttpServletRequest object.

后检索令牌
        LOG.debug("nr of cookies in request " + request.getCookies().length + " response header " + response.getHeaderNames().size());
        request.login(employee.getUsername(), employee.getPassword());
        URI uri = info.getBaseUri().resolve("/login2");
        LOG.debug("new uri is: '"+ uri + "' nr of cookies in request " + request.getCookies().length + " response header " + response.getHeaderNames().size());
        // Add the Higgs Cookie

日志输出表明 headers 的 cookie 数量没有变化。是否有另一种方法可以在完成登录时在同一请求中检索身份验证令牌,最好是独立于平台?我可能可以进行重定向并从下一个请求中读取令牌,但我担心这会带来一些额外的安全威胁。

您想存储该 cookie 的原因是什么?由于它在特定超时后会发生变化,因此存储它不会提供太多价值。下面的代码可用于根据请求访问它。

身份验证令牌是一个 cookie 而不是 header。您必须使用以下代码访问它(此代码在成功验证后可在任何页面中使用):

Cookie cookies[] = request.getCookies();
for(Cookie c : cookies){
    if("LtpaToken2".equals(c.getName())) {
        // do something with ltpa cookie
        out.println(c.getName() + " : " + c.getValue());
    }
}

更新
要在执行登录的 servlet 中获取令牌,请使用以下代码:

Set<Object> credentials = WSSubject.getRunAsSubject().getPrivateCredentials();
for (Object credential : credentials) {
    if(credential instanceof SingleSignonToken) {
        SingleSignonToken token = (SingleSignonToken)credential;
        System.out.println(token.getName());
        System.out.println(token.getUniqueID());
        System.out.println(token.getPrincipal());
        System.out.println("LTPA Token encoded: " + Base64.encode(token.getBytes()));
    }
}