使用gSOAP开发实例(7) 基于HTTPS的基本认证(Basic Authentication)

来源:互联网 发布:淘宝海外代购付款流程 编辑:程序博客网 时间:2024/04/29 23:26

经过前几节的讲解,相信大家都能够熟练地开发gSOAP应用程序,甚至跨平台也不是问题。但是,诸如stockweatherexchange这些应用都是面向大众提供的免费资源,不是企业级的应用,绝大多数都不需要用户认证。而那些商业化的应用却恰恰相反,大部分都要求客户端提供这样那样的验证。

 

由于有认证的免费资源实在难找,我只好把公司正在使用的一个服务的wsdl裁剪一下,拿到这里作为实例,裁剪后的wsdl只保留一个echo接口,顾名思义,就是客户端送什么字符串上来,服务端就返回同样的字符串。这个wsdl如下(业务相关的网址和end point均已作了特别处理):

 

 

 

gsoap-2.7/gsoap/wsdl/目录下建立两个目录:echoecho_server,按照前几节的方法分别建立gSOAP客户端和服务端。客户端与前几节的相比,首先是增加了soap­_ssl_client_context处理HTTPS协议。其次,本案例使用的是基本认证(Basic Authentication),需要在soap变量初始化之后给出用户名和密码。

        struct soap soap;

        soap_init(&soap);

        soap.userid = argv[1];

        soap.passwd = argv[2];

 

客户端完整程序如下:

 

 

 

保存为echo.c,编译命令如下,注意增加了-DWITH_OPENSSL参数,以及需要链接libssl库。

gcc -DWITH_OPENSSL -O2 -o echoecho.c soapC.c soapClient.c ../../stdsoap2.c -I../.. -L../.. -lgsoap –lssl

 

服务端的编写相对麻烦,以下给出一个最简单的实现。与第二节的stock服务端程序相比,主要是增加了soap_ssl_server_context处理HTTPS协议,其中需要用到gsoap-2.7.17自带的ssl实例程序中的几个pem证书,把它们拷贝过来即可使用。另外,与不需要认证的应用相比,__ns1__echo增加了用户密码校验。这个案例里,设定客户端送上来的用户/密码应当为roy/liang,否则将返回401错误。

 


 

保存为echo_server.c,编译命令是:

gcc -DWITH_OPENSSL -O2 -oecho_server echo_server.c soapC.c soapServer.c ../../stdsoap2.c -I../.. -L../..-lgsoap -lssl -lcrypto –lpthread

 

客户端和服务端都编译完成后,首先启动服务端:

-bash-3.2$ ./echo_server 6883

Socketconnect successfully: master socket = 3

 

然后,在另一个窗口运行客户端,由于wsdl里已经指定默认end pointhttps://localhost:6883,因此,客户端并不需要额外给出。

 

正常的返回结果:

-bash-3.2$ ./echo roy liang hi

username  : roy

password  : liang

message   : hi

hi

 

用户、密码不正确将返回401错误:

-bash-3.2$ ./echo roy xxx hi

username  : roy

password  : xxx

message   : hi

Error401 fault: SOAP-ENV:Server [no subcode]

"HTTP/1.1401 Unauthorized"

Detail:<?xml version="1.0" encoding="UTF-8"?>

<SOAP-ENV:Envelopexmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:ns1="http://echo.rsecure.com/ECHO"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:Client</faultcode><faultstring>HTTPError: 401Unauthorized</faultstring></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

 

基于HTTP的基本认证(BasicAuthentication)比基于HTTPS的更加简单,在客户端和服务端的程序去除HTTPS处理即可,不再赘述。

 

另外,本案例中用到的证书的失效日期好像是2010112日,在此之后执行的结果可能会不一样。

 

原创粉丝点击