【问题标题】:Client Digest Authentication with POCO使用 POCO 进行客户端摘要身份验证
【发布时间】:2015-03-18 09:45:05
【问题描述】:

我将 POCO 用于某些服务客户端。客户端应使用摘要身份验证登录。

POCO documentation claims that digest authentication is supported.

这是一个用于处理 HTTP 身份验证的实用程序类(基本或 digest) 在 HTTPRequest 对象中。

这里是完整的测试源代码 (gtest),表明存在一些问题:

#include "UnitTest.h"
#include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPResponse.h>
#include <Poco/Net/HTTPSClientSession.h>
#include <Poco/Net/HTTPClientSession.h>
#include <Poco/StreamCopier.h>
#include <Poco/Net/HTTPCredentials.h>

using namespace Poco::Net;

TEST(PocoDigestAuthTest, HttpBibOrgTest) {
    HTTPClientSession session;
    session.setHost("httpbin.org");

    HTTPRequest request(
        "GET", 
        // "http://httpbin.org/basic-auth/user/passwd", // basic
        "http://httpbin.org/digest-auth/auth/user/passwd",  // digest
        HTTPMessage::HTTP_1_1);
    session.sendRequest(request);

    HTTPResponse response;
    std::istream& firstResponseStream = session.receiveResponse(response);
    std::stringstream firstStrStream;
    Poco::StreamCopier::copyStream(firstResponseStream, firstStrStream);

    ASSERT_EQ(HTTPResponse::HTTP_UNAUTHORIZED, response.getStatus());

    HTTPCredentials creds("user", "passwd");
    creds.authenticate(request, response);
    session.sendRequest(request);

    std::istream& bodyStream = session.receiveResponse(response);
    EXPECT_NE(HTTPResponse::HTTP_UNAUTHORIZED, response.getStatus());
    EXPECT_EQ(HTTPResponse::HTTP_OK, response.getStatus());

    std::stringstream strStream;
    Poco::StreamCopier::copyStream(bodyStream, strStream);
    EXPECT_NE("", strStream.str());
}

此测试在预期状态 HTTP_OK 的情况下失败,我得到 401 (HTTP_UNAUTHORIZED),因此之前的检查也失败了。

如果我将 uri 更改为具有基本身份验证的站点,一切都会按预期工作(测试通过)。

我做错了什么?或者它是 POCO 中的一个错误?我能以某种方式解决它吗?

【问题讨论】:

  • 可能是一个错误。经过一番努力弄清楚发生了什么,我提交了a github issue

标签: c++ http poco-libraries digest-authentication


【解决方案1】:

经过一些测试和思考后发现,该问题与摘要式身份验证无关。您还需要发送由 httpbin.org 服务器设置的 cookie (fake=fake_value)。 Here 是您的示例的修改版本,可以工作。请注意对 setCookies() 的额外调用。此外,在创建 HTTPRequest 时,只需要提供路径,而不是整个 URI。

【讨论】:

  • 感谢这项工作。我的问题是我应该在 http 会话的生命周期内以某种方式处理 cookie 吗?或者我可以仅在摘要身份验证期间使用此 cookie 吗?
  • 此行为特定于 httpbin.org。您是否必须处理 cookie 取决于您使用的网络服务。大多数网络服务不使用 cookie。如果您需要处理 cookie,则需要做一些工作,因为您需要跟踪哪些 cookie 属于哪个服务器(和路径),以及 cookie 的生命周期。
  • 是否有一些页面说明/示例如何使用 Poco 进行操作?我对这个库不熟悉,对http协议只有基本的了解?
  • 上述管理中没有具体的 poco 。响应将包含服务器发送给您的 cookie。如果它希望在后续请求中接收它们(就像 httpbin 显然那样),您必须提供它们。跟踪特定服务器和路径的 cookie 及其生命周期是您的设计; cookie 本身将包含您需要知道的所有信息(过期、域、路径等)。 STL 容器(尤其是 std::map)肯定有助于跟踪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 2023-03-16
  • 2012-01-10
  • 1970-01-01
  • 2022-10-30
  • 2011-05-20
相关资源
最近更新 更多