使用POCO进行客户端摘要式身份验证

时间:2015-03-18 09:45:05

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

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

POCO documentation claims that digest authentication is supported

  

这是一个用于处理HTTP身份验证的实用程序类(基本或   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中的错误?我能以某种方式解决它吗?

1 个答案:

答案 0 :(得分:3)

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