在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 身份验...