Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Soap::Lite Authentication

by Anonymous Monk
on May 16, 2006 at 20:50 UTC ( #549890=perlquestion: print w/ replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

The soap service that I'm trying to connect to has implemented a username and password layer:
<soap:Header> <AuthenticationHeader xmlns="http://www.server.com/"> <username>string</username> <password>string</password> </AuthenticationHeader> </soap:Header>
I've got working c# (shudder) code:
DataSet ds = new DataSet(); theGeoData.AuthenticationHeader auth = new theGeoData.Authenticati +onHeader(); theGeoData.GetData theAd = new theGeoData.GetData(); auth.username = "user"; auth.password = "pass"; theAdds.AuthenticationHeaderValue = auth; ds = theAdds.GetIt();
But my perl code won't authenticate, in fact I get nothing back. I've tried passing the user:pass in the url, and I've tried it with the Transport sub. My code is below. I keep getting the error "Can't call method "GetData" on an undefined value"
sub SOAP::Transport::HTTP::Client::get_basic_credentials { return 'username' => 'user'; return 'password' => 'pass'; }
and
-> service('http://user:pass@server/GetData.asmx?WSDL');
My soap code:
eval { $service = SOAP::Lite -> service('http://server/GetData.asmx?WSDL'); }; #|| ($_); # $@ will have the error message, perldoc -f eval $service -> GetData(); my $som = $service -> call || &soapGetBad();

Comment on Soap::Lite Authentication
Select or Download Code
Re: Soap::Lite Authentication
by borisz (Canon) on May 16, 2006 at 22:41 UTC
    try:
    sub SOAP::Transport::HTTP::Client::get_basic_credentials { return username => 'password'; }
    Boris
Re: Soap::Lite Authentication
by Thelonius (Priest) on May 17, 2006 at 01:30 UTC
    The most important thing here is that you're not checking $@. Using eval and then throwing away $@ means you've lost the most important clue as to what's going on!

    It looks like the service is not using basic authentication, but Soap Header authentication.

    I think the code is going to look something like this:

    use SOAP::Lite; use strict; my $service = SOAP::Lite -> service('http://server/GetData.asmx?WSDL'); my $AuthHeader = SOAP::Header->new( name =>'AuthenticationHeader', attr => { xmlns => "http://www.server.com/" }, value => {username => 'user', password => 'pass' }, ); my $result = $service->GetIt($AuthHeader);
    Without seeing the WSDL, I can't be sure--not that I'm a SOAP expert.
      Hi, If i want to pass both Header and body to an webservice how do i do that.

        Odd question since that is what all the SOAP:: modules are there to do, pass both header and body ... a proper SOAP request, so you don't have to reinvent any wheels. Use SOAP::Simple or its daddy XML::Compile

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://549890]
Approved by wazoox
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (13)
As of 2015-07-06 14:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (75 votes), past polls