1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#!/usr/bin/perl require 5.010_001; use strict; use warnings; use Data::Dumper; use JSON; use LWP::UserAgent 6.03; my $inhalt; my $url = 'https://dev.sepatools.eu/supported_banks.json'; my $ua = LWP::UserAgent->new(); $ua->ssl_opts(verify_hostname => 0); my $req = HTTP::Request->new('GET',$url); my $response = $ua->simple_request($req); if($response->code == 401 && $response->header('WWW-Authenticate') =~ m/realm="([^"]+)"/) { my $realm = $1; $ua->credentials($realm,'Test','username_hier_anonym','passwort_hier_anonym'); $response = $ua->get($url); if ($response->is_success) { my $content = $response->content; my $ref = JSON->new->utf8->decode($content); $inhalt = 'Ergebnis mit Realm "$realm":<br><pre>'.Dumper($ref).'</pre>'; } else { $inhalt = 'Fehler: "'.($response->status_line).'"'; } } else { $inhalt = 'Die Seite reagiert unerwartet, die Authentifikationsanforderung kommt nicht.'; } print $inhalt;
1
2
3
4
5
6
7
8
$ua->credentials( $netloc, $realm )
$ua->credentials( $netloc, $realm, $uname, $pass )
Get/set the user name and password to be used for a realm.
The $netloc is a string of the form "<host>:<port>". The username and password will only
be passed to this server. Example:
$ua->credentials("www.example.com:80", "Some Realm", "foo", "secret");
2013-06-12T19:33:27 pqdas erste argument für credentials muss server und port sein:
2013-06-13T04:57:27 biancaIch frage mal beim Anbieter, ob Port 443 vielleicht falsch ist.
Quote401 Unauthorized
2013-06-12T19:47:52 GwenDragonJan beschrieb ja in msg #153024 wie du den realm bekommst.
curl -X GET --digest -u username:passwort -H "Content-Type:application/on" -d '{"param":"value"}' https://dev.sepatools.eu/supported_banks
2013-06-13T06:33:45 biancaKann ich überprüfen, ob mein Code/das Modul das richtig macht?
QuoteIP - - [13/Jun/2013:08:14:21 +0200] "GET /supported_banks HTTP/1.1" 401 4490 "-" "curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"
IP - - [13/Jun/2013:08:14:21 +0200] "GET /supported_banks HTTP/1.1" 200 1162 "-" "curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"
QuoteIP - - [13/Jun/2013:08:31:50 +0200] "GET /supported_banks HTTP/1.1" 401 4495 "-" "libwww-perl/6.05"
1
2
3
4
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->add_handler("request_send", sub { shift->dump; return });
$ua->add_handler("response_done", sub { shift->dump; return });
2013-06-13T16:02:20 janHast Du mal geschaut, was genau LWP denn bekommt und sendet und das verglichen mit dem, was Firefox bekommt und sendet (LiveHTTPHeader o.ä.)?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Firefox:
Request:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-us,en;q=0.7,de;q=0.3
Authorization: Digest username="***", realm="dev.sepatools.eu", nonce="5086e8af66288573136d73c684cf0893", uri="/supported_banks.json", algorithm=MD5, response="48f4b5e0da74b634edad0b07f4184e4c", opaque="94619f8a70068b2591c2eed622525b0e", qop=auth, nc=00000001, cnonce="00847946a84d3c8a"
Connection: keep-alive
Host: dev.sepatools.eu
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0
Response:
Access-Control-Allow-Cred...: true
Access-Control-Allow-Head...: *
Access-Control-Allow-Meth...: POST,GET,PUT,DELETE,HEAD
Access-Control-Allow-Orig...: *
Access-Control-Max-Age: 604800
Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 284
Content-Type: application/json; charset=utf-8
Date: Fri, 14 Jun 2013 05:30:00 GMT
Keep-Alive: timeout=15, max=99
Server: Apache/2.2.16 (Debian)
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.3-7+squeeze15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Script:
GET https://dev.sepatools.eu/supported_banks.json
User-Agent: libwww-perl/6.05
(no content)
HTTP/1.1 401 Unauthorized
Connection: close
Date: Fri, 14 Jun 2013 04:29:46 GMT
Server: Apache/2.2.16 (Debian)
Vary: Accept-Encoding
WWW-Authenticate: Digest realm="dev.sepatools.eu", domain="/", qop=auth, algorithm=MD5, nonce="80f59644e94dca775174dee611ee1543", opaque="94619f8a70068b2591c2eed622525b0e"
Content-Length: 58
Content-Type: text/html
Client-Date: Fri, 14 Jun 2013 04:29:45 GMT
Client-Peer: ***
Client-Response-Num: 1
Client-SSL-Cert-Issuer: /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 3 Primary Intermediate Server CA
Client-SSL-Cert-Subject: /description=D77lqt6MXs1120Z8/C=DE/ST=Niedersachsen/L=Hasbergen/O=Theano GmbH/CN=*.sepatools.eu/emailAddress=postmaster@sepatools.eu
Client-SSL-Cipher: DHE-RSA-AES256-SHA
Client-SSL-Warning: Peer certificate not verified
X-Powered-By: PHP/5.3.3-7+squeeze15
HTTP Digest Authentication required for "dev.sepatools.eu"
GET https://dev.sepatools.eu/supported_banks.json
Authorization: Digest username="***", realm="dev.sepatools.eu", qop="auth", algorithm="MD5", uri="/supported_banks.json", nonce="80f59644e94dca775174dee611ee1543", nc="00000001", cnonce="51ba9c39", response="cbb67ea985fde861e33fd144e77d601d", opaque="94619f8a70068b2591c2eed622525b0e"
User-Agent: libwww-perl/6.05
(no content)
HTTP/1.1 401 Unauthorized
Connection: close
Date: Fri, 14 Jun 2013 04:29:46 GMT
Server: Apache/2.2.16 (Debian)
Vary: Accept-Encoding
WWW-Authenticate: Digest realm="dev.sepatools.eu", domain="/", qop=auth, algorithm=MD5, nonce="80f59644e94dca775174dee611ee1543", opaque="94619f8a70068b2591c2eed622525b0e"
Content-Length: 58
Content-Type: text/html
Client-Date: Fri, 14 Jun 2013 04:29:45 GMT
Client-Peer: ***
Client-Response-Num: 1
Client-SSL-Cert-Issuer: /C=IL/O=StartCom Ltd./OU=Secure Digital Certificate Signing/CN=StartCom Class 3 Primary Intermediate Server CA
Client-SSL-Cert-Subject: /description=D77lqt6MXs1120Z8/C=DE/ST=Niedersachsen/L=Hasbergen/O=Theano GmbH/CN=*.sepatools.eu/emailAddress=postmaster@sepatools.eu
Client-SSL-Cipher: DHE-RSA-AES256-SHA
Client-SSL-Warning: Peer certificate not verified
X-Powered-By: PHP/5.3.3-7+squeeze15
HTTP Digest Authentication required for "dev.sepatools.eu"
Fehler: "401 Unauthorized"
2013-06-14T08:52:05 janLass doch mal den simple_request und so weg, setz den Realm von Hand und probier's dann noch mal.
2013-06-14T08:52:05 janWie sieht die Zeile, in der Du die credentials angibst, jetzt genau aus?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#!/usr/bin/perl require 5.010_001; use strict; use warnings; use Data::Dumper; use JSON; use LWP::UserAgent 6.03; my $inhalt; my $url = 'https://dev.sepatools.eu/supported_banks.json'; my $ua = LWP::UserAgent->new(); $ua->add_handler("request_send", sub { shift->dump; return }); $ua->add_handler("response_done", sub { shift->dump; return }); $ua->ssl_opts('verify_hostname' => 0); $ua->credentials('dev.sepatools.eu:443',"dev.sepatools.eu",'***','***'); my $response = $ua->get($url); if ($response->is_success) { my $content = $response->content; my $ref = JSON->new->utf8->decode($content); $inhalt = 'Ergebnis:<br><pre>'.Dumper($ref).'</pre>'; } else { $inhalt = 'Fehler: "'.($response->status_line).'"'; } print $inhalt;
2013-06-14T14:16:49 janDas einzige, was mir auffällt, ist, dass Firefox offensichtlich nicht überall im Auth-Header Anführungszeichen setzt, Perl schon:
2013-06-14T14:16:49 janDu könntest natürlich mal im Code herumhacken und das ändern.
2013-06-14T14:28:56 biancaNein, das werde ich nicht tun. Was da alles dran hängt, ein bestehendes Modul zu modifizieren. Das tue ich mir nicht an. Es muss anders gehen.
2013-06-14T14:36:58 janEs kann sein, dass das ein Bug ist, das kannst Du aber nur herausfinden, indem Du ihn fixt und dann testest. Mag auch sein, dass es von der Gegenstelle abhängig ist, sprich, Firefox gibt zurück, was die Gegenstelle sagt, während LWP immer Anführungszeichen setzt.
So schlimm ist das auch nicht: einfach die .pm-Dateien kopieren und relativ zum Script in die entsprechende Ordnerstruktur packen. Dann kannst Du in denen rumbasteln und machst dir nicht deine "richtige" Installation kaputt.
1
2
3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-us,en;q=0.7,de;q=0.3
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0
1 2 3 4 5
LWP::UserAgent->new( ... requests_redirectable => ['GET', 'HEAD', 'POST'], ... );
2013-06-14T10:16:15 GwenDragonwenn du noch die Accept-Header also als Firefox ausgibst, vielleicht klappst dann.
2013-06-14T10:16:15 GwenDragonUnd manchmal hatte früher LWP Probleme bei Redirects.
2013-06-14T15:41:09 GwenDragonIst es möglich nur zum Testen mal einen Usernamen/Password zu bekommen?
2013-06-14T15:44:11 biancaKlappt hervorragend. Daher tippe ich im Moment auf eine Eigenart bei der Gegenstelle die wir gerade untersuchen.
2013-06-14T16:06:17 GwenDragonViel Erfolg beim Entwanzen.
2013-06-14T15:41:09 GwenDragonIst es möglich nur zum Testen mal einen Usernamen/Password zu bekommen?
2013-06-14T15:41:09 GwenDragonOder ist das bei sepatools ein zu bezahlender Dienst mit Verpflichtungen?
1 2 3 4 5 6 7 8 9 10 11 12
# original: sub auth_header { ... for (@order) { next unless defined $resp{$_}; push(@pairs, "$_=" . qq("$resp{$_}")); } my $auth_value = "Digest " . join(", ", @pairs); return $auth_value; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# modifiziert sub auth_header { ... for (@order) { next unless defined $resp{$_}; if ( $_ eq 'nc' ) { push(@pairs, "$_=" . qq($resp{$_})); } else { push(@pairs, "$_=" . qq("$resp{$_}")); } } my $auth_value = "Digest " . join(", ", @pairs); return $auth_value; }
2013-06-15T20:06:18 LinuxerWas nun das korrekte Verhalten wäre, weiß ich nicht.
QuoteAuthorization: Digest username="Mufasa",
realm="testrealm@host.com",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
uri="/dir/index.html",
qop=auth,
nc=00000001,
cnonce="0a4f113b",
response="6629fae49393a05397450978507c4ef1",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
2013-06-15T20:06:18 Linuxerentweder musst Du Dein LWP::Authen::Digest patchen
1
2
$ mkdir -p /dein/lib/LWP/Authen
$ cp /original/LWP/Authen/Digest.pm /dein/lib/LWP/Authen/
2013-06-16T10:51:24 topegDann muss natürlich auch ein use lib "/dein/lib"; im vor dem use LWP::UserAgent; Code stehen oder die Umgebungsvariable PERL5LIB muss entsprechend gesetzt sein.
2013-06-15T20:37:40 biancaHabe dort lediglich jetzt schon ein eigenes Module-Verzeichnis, was mit use lib eingebunden wird.
Guest weruse und require get @INC durch. das zuerst gefundene modul wird benutzt. "use lib" muss vor "use LWP"
2013-06-16T13:47:22 biancaWo wird Digest.pm im Modul intern aufgerufen?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
my $class = "LWP::Authen::\u$scheme"; $class =~ s/-/_/g; no strict 'refs'; unless (%{"$class\::"}) { # try to load it eval "require $class"; if ($@) { if ($@ =~ /^Can\'t locate/) { $response->header("Client-Warning" => "Unsupported authentication scheme '$scheme'"); } else { $response->header("Client-Warning" => $@); } next CHALLENGE; } }
2013-06-17T09:33:31 GwenDragonWie hast du jetzt LWP::Authen::Digest gepatcht, dass es geht?
push(@pairs, "$_=" . qq("$resp{$_}"));
1 2 3 4 5 6
if ( $_ eq 'nc' || $_ eq 'qop' || $_ eq 'algorithm' ) { # diese drei Parameter müssen ohne Anführungszeichen (http://www.ietf.org/rfc/rfc2617.txt), selbst eingebaut, siehe Bugreport: https://rt.cpan.org/Public/Bug/Display.html?id=43354 und Forum: http://www.perl-community.de/bat/poard/thread/18377 push(@pairs, "$_=" . qq($resp{$_})); } else { push(@pairs, "$_=" . qq("$resp{$_}")); }
2013-06-17T09:33:31 GwenDragonWelches LWP::Authen::Digest ist es, dass du gepatcht hast.
2013-06-17T09:33:31 GwenDragonHast du ein diff?