使用 SpringFramework RestTemplate 的 ALM 12 REST:“401 QCSession cookie 丢失”

ALM 12 REST using SpringFramework RestTemplate: "401 QCSession cookie missing"

在 ALM 12 中,我们必须显式调用 "qcbin/rest/site-session" 来获取会话。 当我 GET 调用“/qcbin/rest/site-session”时,我收到以下信息:

"Set-Cookie=[BIGipServerALMAST330P-QC=rd100o00000000000000000000ffff0fe0dd74o8080; path=/, ]""

我按照此处所述提取 cookie: HP ALM 12 REST not returning QCSession cookie。 我们的项目使用 SpringFramework 中的 RestTemplate 而不是这个 RestConnector,所以我做了:

        private HashMap getQCSession() throws Exception {
            URL url = new URL("https://almxxxx.saas.hp.com/qcbin/rest/site-session?login-form-required=y");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/xml");
            conn.setRequestProperty("Accept", "application/xml");
            conn.connect();

            HashMap cookies = updateCookies(conn);
            return cookies;
        }


        public HashMap updateCookies(HttpURLConnection conn) {
            String cookie2 = conn.getHeaderField("Set-Cookie");             
            int equalIndex = cookie2.indexOf('=');
            int semicolonIndex = cookie2.indexOf(';');
            String cookieKey = cookie2.substring(0, equalIndex);
            String cookieValue = cookie2.substring(equalIndex + 1, semicolonIndex);

            HashMap cookies = new HashMap();
            cookies.put(cookieKey, cookieValue);
            System.out.println(cookies.toString());
            return cookies;
        }

为了使用 RestTemplate 在 GET 调用中发送 cookie,我遵循了 http://springinpractice.com/2012/04/08/sending-cookies-with-resttemplate/ 中的说明,所以我做到了:

public <U extends Object> ResponseEntity<U> getFromURL(URI url, Class<U> responseBodyClass) throws Exception {
        logger.info("GET na URL: {} esperando classe: {} no response", url, responseBodyClass);

        HashMap cookie = this.getQCSession();
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.add("Cookie", this.getQCSession().toString());
        this.httpEntity = new HttpEntity(null, requestHeaders);

        return super.exchange(url, HttpMethod.GET, this.httpEntity, responseBodyClass);
    }

HttpEntity(SpringFramework)中添加的requestHeaders内容为:

{Cookie=[{BIGipServerALMAST330P-QC=rd100o00000000000000000000ffff0fe0dd74o8080}]}

但是我仍然收到“401 QCSession cookie 丢失”。
我已经尝试在 GET 调用中发送 JSESSIONID,但也没有成功。

我感谢任何帮助。 有什么线索吗?

我运行进入这个。从 ALM12 开始,您还需要创建一个 session。

我POST一些XML或JSON到这里“/authentication-point/alm-authenticate”进行验证 然后收集 Set-Cookie header 然后我 POST 到“/rest/site-session” 与来自先前响应的 cookie。
我从该响应中收集了 session 个 cookie,以便在我的后续请求中使用。

希望对您有所帮助

我不知道,如果它可以帮助你,但你发送它时带有用于 UI 身份验证的查询参数。

"POST .../rest/site-session?login-form-required=y"

我建议POST它没有查询参数

"POST .../rest/site-session"

此外,在请求 QCSession 令牌之前您应该执行的操作顺序是:

1.Check是否通过认证

 "GET .../rest/is-authenticated"

2.If 不是你会得到验证位置的参考:WWW-Authenticate: LWSSO realm=".../authentication-point"

3.Send 基本身份验证 header 到最后添加 alm-authenticate 的身份验证点。 return 你 LWSSO_COOKIE_KEY.

"POST .../authentication-point/alm-authenticate"
Authentication: Basic BASE64{username:password}

4.Then 您需要 POST LWSSO_COOKIE_KEY 到 site-session 并且 ALM 将 return 您的 QCSession 密钥。

"POST .../rest/site-session"
"Cookie: LWSSO_COOKIE_KEY={cookie}; Path=/"

希望我能帮到你。 如果您还有问题,请随时与我联系。