2

SOAP::LITE を使用して HP Service Manager サイトにアクセスする簡単なテスト アプリを作成しようとしていますが、失敗しています。(私はSOAP::WSDLも試しましたが、さらに読んで、私がやりたいことには本当に必要ではないと確信しました。)

私はSOAP、これらのパッケージ、そして私がやろうとしていることに慣れていないので、間違っていることがいくつあるかわかりませんが、それをいくつかに要約したと思います.私にはうまくいくはずのコード行。本質的な問題は認証にあると思いますが、SOAP 経由でサービス マネージャー ルーチンを呼び出そうとしている方法に問題があるのではないかと考えたこともあります。

最初に見つけた方法は次のとおりです。

#!/usr/local/perl5/bin/perl
use SOAP::Lite+trace => 'all';

$USER = "working_user_name";
$PASS = "working_password";

sub SOAP::Transport::HTTP::Client::get_basic_credentials {
        print "###\n";
        print "###\n";
        print "### Authenticating...\n";
        print "###\n";
        print "###\n";
        return $USER => $PASS;
}


my $soap = SOAP::Lite->new(proxy => 'http://<hp_service_manager>:13080/SM/7/ws');
$soap->default_ns('http://schemas.hp.com/SM/7');
my $som = $soap->call('RetrieveList');
die $som->faultstring if ($som->fault);
print $som->result, "\n";

そして、私が試したLWPメソッド:

#!/usr/local/perl5/bin/perl
use SOAP::Lite+trace => 'all';
use LWP::UserAgent;
use LWP::Debug;
LWP::Debug::level('+');

$USER = "working_user_name";
$PASS = "working_password";

my @ua_args = (keep_alive => 1);
my @credentials = ($SERVICE_NS, "", $USER, $PASS);
my $schema_ua = LWP::UserAgent->new(@ua_args);
$schema_ua->credentials(@credentials);

my $soap = SOAP::Lite->new(proxy => 'http://<hp_service_manager>:13080/SM/7/ws', @ua_args, credentials => \@credentials);
$soap->default_ns('http://schemas.hp.com/SM/7');
my $som = $soap->call('RetrieveList');
die $som->faultstring if ($som->fault);
print $som->result, "\n";

問題は、私が何をしても「許可されていない」返品を受けることです。HP Service Manager のインストールです。私がやろうとしていることの WSDL エントリを提供します。私はそれが有用であることを疑います。

<soap:operation soapAction="RetrieveList" style="document"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>

これがどこから来たのかはもっとたくさんありますが、これは適切な出力であると私は信じています:

SOAP::Transport::HTTP::Client::send_receive: HTTP::Request=HASH(0x845c630)
SOAP::Transport::HTTP::Client::send_receive: POST http://<service_manager>:13080/SM/7/ws HTTP/1.1
Accept: text/xml
Accept: multipart/*
Content-Length: 488
Content-Type: text/xml; charset=utf-8
SOAPAction: "#default_ns"

<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><default_ns><c-gensym3 xsi:type="xsd:string">http://schemas.hp.com/SM/7</c-gensym3></default_ns></SOAP-ENV:Body></SOAP-ENV:Envelope>
SOAP::Transport::HTTP::Client::send_receive: HTTP::Response=HASH(0x8597238)
SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 401 Unauthorized
Connection: close
Date: Fri, 15 Feb 2013 19:42:06 GMT
Server: Apache-Coyote/1.1
WWW-Authenticate: Basic realm="CASM"
Content-Length: 40
Content-Type: text/html;charset=utf-8
Client-Date: Fri, 15 Feb 2013 19:42:07 GMT
Client-Peer: nnn.nn.nn.nn:13080
Client-Response-Num: 1

<HTML><BODY>Not Authorized</BODY></HTML>

誰でも助けることができますか?私は見つけることができたほとんどすべての例を試してから、それらの例のバリエーションを試しましたが、それ以上のものを得ることができませんでした. いずれの場合も、「承認されていません」という返品が返されます。

ありがとう、

ショーン。

4

2 に答える 2

4

誤解しないでください: SOAP::Lite のデバッグ出力には Authorization ヘッダーが表示されません (何らかの理由で?)。

「get_basic_credentials のオーバーライド」メソッドは、ドメインとレルムに関係なく、ユーザー名/パスワードをグローバルに設定します。実際、悪いことは何ですか...

この(テスト済みの)コードは問題を解決するはずです:

#!/usr/local/perl5/bin/perl -w
use strict;
use SOAP::Lite+trace => 'all';

my $soap = SOAP::Lite->new('proxy' => [
                        'http://<yourdomain>:<yourport>/<yourpath>',
                        'credentials' => [
                                "<yourdomain>:<yourport>",
                                "<yourrealm>",
                                "<yourusername>",
                                "<yourpassword>"
                        ]
                ]);
my $som = $soap->RetrieveList();
die $som->faultstring if ($som->fault);
print $som->result, "\n";

" <yourrealm>" は "CASM"、" <yourpath>" は "/SM/7/ws"、" <yourport>" は "13080" に設定する必要があります。

古い回答: 代わりに次のようにしてみてください (余分なアスタリスクに注意してください):

*SOAP::Transport::HTTP::Client::get_basic_credentials = sub { 
 return ($USER, $PASS);
}
于 2013-02-18T14:52:34.780 に答える
0

このガイドは見つかりましたか?http://www.perl.com/pub/2001/04/24/soap.html#security%20%28ssl,%20basic/digest%20authentication,%20cookiebased%20authentication,%20ticketbased%20authentication,%20access%20control% 29

それともこの答え?Perl SOAP::Lite リクエストに authHeader を追加する

# create header for requests 
my $authHeader = SOAP::Header->name("xsd:authHeader" => 
\SOAP::Header->value(
    SOAP::Header->name('xsd:user')->value($s7user)->type(''),
    SOAP::Header->name('xsd:password')->value($s7pass)->type(''),
    SOAP::Header->name('xsd:appName')->value('TestApp')->type(''),
    SOAP::Header->name('xsd:appVersion')->value('0.03')->type('')
));

# create data to pass as method paramaters
my $params = SOAP::Data->name('ns:email')->value($s7user)->type('');

# request method
$soap->call('checkLogin', $params, $authHeader);
于 2013-02-18T14:08:47.600 に答える