在SoupSession中更改libsoup身份验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在SoupSession中更改libsoup身份验证相关的知识,希望对你有一定的参考价值。

我有一个正在运行的libsoup客户端,该客户端使用HTTP POST和基本身份验证发送数据。身份验证通过回调在libsoup中进行处理-当服务器要求身份验证libsoup通过回调发出信号时-然后函数soup_auth_authenticate()传递给定类型为SoupAuth的给定对象以及用户名和密码。

#include <iostream>
#include <iomanip>
#include <string>
#include <libsoup/soup.h>
using namespace std;

void authenticate(SoupSession *session, SoupMessage *msg, SoupAuth *auth, gboolean retrying, gpointer data) 
    soup_auth_authenticate(auth, "foo", "bar");


int main() 
    SoupSession* session = soup_session_new_with_options(SOUP_SESSION_USER_AGENT, "stackoverflow",
                                                         SOUP_SESSION_ADD_FEATURE_BY_TYPE, SOUP_TYPE_COOKIE_JAR,
                                                         NULL);
    g_signal_connect(session, "authenticate", G_CALLBACK(authenticate), nullptr);
    SoupMessage* post_msg = soup_message_new("POST", "https://example.org/work.php");
    string formdata = "first_name=Captain&last_name=Picard";
    soup_message_set_request(post_msg, "application/x-www-form-urlencoded", SOUP_MEMORY_COPY, formdata.c_str(), formdata.size());
    soup_session_send_message(session, post_msg);
    cout << left << setw(22) << "status code: " << right << post_msg->status_code << "\n";
    cout << left << setw(22) << "reason phrase: " << right << post_msg->reason_phrase << "\n";
    cout << left << setw(22) << "response body length: " << right << post_msg->response_body->length << "\n";
    cout << left << setw(22) << "response body data: " << right << post_msg->response_body->data << "\n";
    // TODO call soup_session_send_message() again with modified username and password
    return EXIT_SUCCESS;

您可以使用g++ -o sample sample.cpp -Wall -pedantic -g `pkg-config libsoup-2.4 --cflags --libs`进行编译。当您需要对此进行测试时,请将域从example.org更改为flapflap.eu,这将为您提供一个有效的端点。

[我想在后续通话中发送其他用户名或密码时该怎么办?该库将不再使用回调,因为身份验证已设置并且已经可以使用。

我需要创建一个新的SoupSession吗?还是可以访问当前的SoupAuth并直接致电soup_auth_authenicate()?我想让客户保持快速运转。

谢谢您的帮助

答案

底部的背景信息表明您无需创建新的SoupSession即可进行后续身份验证请求。虽然尚不清楚soup_auth_authenticate()调用是执行此操作的方法。以下是此libsoup页面上与身份验证相关的呼叫的列表:

SoupAuth *  soup_auth_new ()
gboolean    soup_auth_update ()
gboolean    soup_auth_negotiate_supported ()
gboolean    soup_auth_is_for_proxy ()
const char *    soup_auth_get_scheme_name ()
const char *    soup_auth_get_host ()
const char *    soup_auth_get_realm ()
char *  soup_auth_get_info ()
void    soup_auth_authenticate ()
gboolean    soup_auth_can_authenticate ()
gboolean    soup_auth_is_authenticated ()
gboolean    soup_auth_is_ready ()
char *  soup_auth_get_authorization ()
GSList *    soup_auth_get_protection_space ()
void    soup_auth_free_protection_space ()

Basics page中各行之间的读取似乎表明可以在单个SoupSession中进行多个身份验证请求。

处理身份验证

SoupSession处理以下HTTP身份验证的大部分详细信息: 您。如果收到401(“未经授权”)或407(“代理” 要求验证”),会话将发出 验证信号,为您提供一个SoupAuth对象,指示 身份验证类型(“基本”,“摘要”或“ NTLM”)和领域 服务器提供的名称。如果您有用户名和密码 可用(或可以生成一个),调用soup_auth_authenticate给出 libsoup的信息。会话将自动重新排队 消息,然后使用该身份验证信息重试。 (如果你 不要调用soup_auth_authenticate,会话将只返回 消息以401或407状态发送给应用程序。)

如果服务器不接受提供的用户名和密码,则 会话将再次发出身份验证,并设置重试参数 为TRUE。这使应用程序知道它的信息 之前提供的信息不正确,因此有机会再次尝试。如果 此用户名/密码对也不起作用,会话将 一次又一次地发出身份验证的常量,直到提供 用户名/密码成功认证,或直到信号 处理程序无法调用soup_auth_authenticate,此时libsoup 将允许消息失败(状态为401或407)。

如果您需要异步处理身份验证(例如,弹出一个 密码对话框而无需递归进入主循环),您可以 也这样做。只需在消息上调用soup_session_pause_message 从信号处理程序返回之前,然后g_object_ref SoupAuth。然后,稍后,在调用soup_auth_authenticate(或 决定不这样做),请调用soup_session_unpause_message以恢复 已暂停的消息。

[This Manpagez post还讨论了每个会话进行多个身份验证的呼叫:

大多数应用程序只需要一个SoupSession;首要的 您可能需要多个会话的原因是是否需要 多个独立的身份验证上下文。 (例如,您正在 到服务器并以不同身份的两个不同用户身份进行身份验证 次;确保与每个SoupMessage一起发送的最简单方法 您打算使用的身份验证信息是一个会话 第一个用户,另一个用户的第二个会话。)

以上是关于在SoupSession中更改libsoup身份验证的主要内容,如果未能解决你的问题,请参考以下文章

ini 使用libsoup segfault修复eclipse(adt)崩溃。将此添加到eclipse.ini

我用的是window server 2003系统, 管理工具 计算机管理中:无本地用户和组,如何调出?另用window 身份验...

安全验证必备——语音验证码短信 API

如何使用 GTKMM 进行 GET 请求

警惕!别让验证码“验”走你的钱

在 IIS 中禁用匿名身份验证后 WebServiceHost 无法正常工作