使用gSOAP开发实例--Usernametoken Authentication实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用gSOAP开发实例——自定义header实现用户名令牌认证(Usernametoken Authentication)

上一节介绍了怎样实现基本认证(Basic Authentication,以下简称basic方式),望文生义,也就是最简单的用户验证方式,本节稍微深入一些,介绍用户名令牌认证(Usernametoken Authentication,以下简称usernametoken方式)。

Usernametoken方式与basic方式不同的地方,在于后者会把用户名和密码以摘要(digest)的形式,置于HTTP信息头,而前者则把用户名以明文的形式、密码以明文或者摘要的形式,嵌入到一段XML文本中,再置于SOAP消息头当中。

如果使用soapUI调试客户端程序的话,会发现以下是basic方式发出的完整的SOAP消息:

POST https:///Services/ECHO HTTP/0.9

Content-Type: text/xml;charset=UTF-8

SOAPAction: ""

User-Agent: Jakarta Commons-HttpClient/3.1

Content-Length: 292

Authorization: Basic VkYtSEstbVNNST0OdlR42EMZaD1BMyE=

Host:

Cookie: $Version=0; MSP2LB=test2.test2f02; $Path=/

xmlns:echo="/ECHO">

hello

以下是usernametoken方式发出的完整的SOAP消息:

POST https:///4.0/services/SecureEcho HTTP/1.1

Content-Type: text/xml;charset=UTF-8

SOAPAction: ""

User-Agent: Jakarta Commons-HttpClient/3.1

Host:

Content-Length: xxx

xmlns:soapenv="/soap/envelope/">

xmlns:wsse="/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">

xmlns:wsu="/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

roy

Type="/wss/2004/01/oasis-200401-wss-username-token-profile-1 .0#PasswordText">liang

LX4gh+njbEtCNAtkWkXDYA==

2010-08-11T06:02:25.874Z

G06164

hello

其中,加粗部分表示两者的主要区别,红字部分表示各自必不可少的元素。

由此可以看出,usernametoken方式的特点,是在SOAP的header中加入一个Security标签,把usernametoken 信息放在这个Security标签里。至于header里的另外一个customerId标签,是该应用自身的额外要求。

gSOAP实现basic方式相对简单,不过实现usernametoken就比较复杂。gSOAP的用户指南推荐使用其自带的插件,在samples/wsse目录下的官方实例也是使用这个插件。但是,我个人认为这种方法比较累赘,自动生成的代码太多,不易看懂,而且似乎非常依赖于wsdl本身的写法。比如,samples/wsse目录下的官方实例含有下列表示SOAP header 的结构体,但是,在我实际开发的应用并没有自动产生,即使强行加上去,编译执行通过,运行的时候也出现了相当多的错误。

struct SOAP_ENV__Header

{

struct _wsse__Security *wsse__Security

};

而且,从理论上讲,gSOAP不过是一个框架,定义了从SOAP对象到SOAP消息,以及从SOAP消息到SOAP对象的序列化过程,并且提供了一套与之相适应的API,使用gSOAP开发不过是在其框架范围内调用其API编程。框架的弊端,可想而知,限制了灵活,也限制了方便,更限制了创新。所以,我们可以使用gSOAP编程,但是也许没有必要全部照搬,至少在这个案例中,就没有必要照搬。

相关文档
最新文档