gpt4 book ai didi

perl - LWP::UserAgent HTTP 基本身份验证

转载 作者:行者123 更新时间:2023-12-02 03:43:39 25 4
gpt4 key购买 nike

我尝试运行这个 perl5 程序:

 #!/usr/bin/env perl                                                             

use strict;
use warnings;
use LWP;

my $ua = LWP::UserAgent->new('Mozilla');
$ua->credentials("test.server.com:39272", "realm-name", 'user_name', 'some_pass');
my $res = $ua->get('http://test.server.com:39272/');

print $res->content;

另一方面,我有 HTTP::Daemon:

#!/usr/bin/env perl                                                                                       

use strict;
use warnings;

use HTTP::Daemon;

my $hd = HTTP::Daemon->new or die;

print "Contact URL: ", $hd->url, "\n";
while (my $hc = $hd->accept) {
while (my $hr = $hc->get_request) {
if ($hr->method eq 'GET') {
print $hr->as_string, "\n";
}
}
$hc->close;
undef($hc);
}

它只是打印:

Contact URL: http://test.server.com:39272/
GET / HTTP/1.1
Connection: TE, close
Host: test.server.com:39272
TE: deflate,gzip;q=0.3
User-Agent: libwww-perl/6.03

所以我看到 LWP::UserAgent 不发送 HTTP 基本身份验证,但我不知道为什么。

我在这个网站上看到了一些帖子,但他们有相同的基本代码,但它没有工作...

如果我使用 HTTP::Request 那么它就可以工作:

my $req = GET 'http://test.server.com:39272/';                        
$req->authorization_basic('my_id', 'my_pass');
my $res = $ua->request($req);

输出:

GET / HTTP/1.1
Connection: TE, close
Authorization: Basic bXlfaWQ6bXlfcGFzcw==
Host: test.server.com:39272
TE: deflate,gzip;q=0.3
User-Agent: libwww-perl/6.03

我之前是不是做错了什么?

最佳答案

只有当服务器告诉 LWP 它正在尝试访问某个领域时,LWP 才会发送该领域的凭据。特定用户可能只能访问特定领域或对于不同领域具有不同的密码。如果没有领域,LWP 不知道从其凭据中选择哪一个。此外,LWP 不会使用您存储在凭据中的数据,除非受到质疑。你没有这样做。

如果您通过指定 Authorization header 直接提供凭据,则不会进行领域检查。如果您自己明确设置的话,您随时可以发送您喜欢的任何 header ,因此看到它也就不足为奇了。

您只需要一个更好的测试服务器:

use strict;                                                                     
use warnings;

use HTTP::Daemon;
use HTTP::Status;

my $server = HTTP::Daemon->new or die;

print "Contact URL: ", $server->url, "\n";
while (my $connection = $server->accept) {
while (my $request = $connection->get_request) {
print $request->as_string;
unless( $request->header( 'Authorization' ) ) {
$connection->send_response( make_challenge() )
}
else {
$connection->send_response( make_response() )
}
}
$connection->close;
}

sub make_challenge {
my $response = HTTP::Response->new(
401 => 'Authorization Required',
[ 'WWW-Authenticate' => 'Basic realm="Buster"' ],
);
}

sub make_response {
my $response = HTTP::Response->new(
200 => 'Huzzah!',
[ 'Content-type' => 'text/plain' ],
);

$response->message( 'Huzzah!' );
}

当您运行客户端一次时,应该有两个请求:

GET / HTTP/1.1
Connection: TE, close
Host: macpro.local:52902
TE: deflate,gzip;q=0.3
User-Agent: libwww-perl/6.02

GET / HTTP/1.1
Connection: TE, close
Authorization: Basic dXNlcl9uYW1lOnNvbWVfcGFzcw==
Host: macpro.local:52902
TE: deflate,gzip;q=0.3
User-Agent: libwww-perl/6.02

关于perl - LWP::UserAgent HTTP 基本身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8203964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com