2011-06-22 15 views
6

के साथ सुरक्षित वेब सेवाएं बनाना मैंने कोल्डफ्यूजन का उपयोग करके वेब सेवाओं के साथ एक मौजूदा एपीआई बनाई है जो इनलाइन प्रमाणीकरण का उपयोग करती है लेकिन मैं इसे किसी प्रकार के प्रमाणीकरण का उपयोग करके सुरक्षित करना चाहता हूं लेकिन मुझे लगता है कि कहां से शुरू करना है।कोल्डफ्यूजन

वेब सेवाओं को मेरे सीएफसीएस के अंत में wsdl जोड़कर कोल्डफ्यूजन द्वारा स्वतः उत्पन्न किया जाता है।

जब मैं कहता हूँ "" मेरा मतलब है कि प्रत्येक वेब सेवा कॉल के लिए क्लाइंट/एक प्रमुख में पारित soapenv भीतर से गुजरना होगा: शरीर इस तरह:

<apiKey xsi:type="xsd:string">test</apiKey> 
<apiPass xsi:type="xsd:string">test!ng</apiPass> 

लेकिन मुझे लगता है मैं उपयोग करना चाहते हैं डब्ल्यूएस-सुरक्षा या मूल प्रमाणीकरण लेकिन मुझे नहीं पता कि मैं क्या कर रहा हूं।

ऐसा कोई नहीं लगता है जो मैं सीएफ समुदाय में पूछ रहा हूं, जो अजीब लगता है।

उत्तर

3

मैं सामान्य रूप से डब्लूएसई (http://oasis-open.org/) या SOAP का प्रशंसक नहीं हूं लेकिन यह एकीकरण स्थितियों में उपयोगी हो सकता है, उदाहरण के लिए हमने .NET वेब सेवाओं का उपभोग करते समय इसका उपयोग किया है ।

मेरी प्राथमिकता आईपी और सुरक्षा टोकन या उपयोगकर्ता नाम/पासवर्ड द्वारा अनुरोध प्रमाणित करने के लिए वेब सेवा के रूप में एक ही निर्देशिका में Application.cfc का उपयोग करना है। हम इसका उपयोग हमारी रीस्टफुल वेब सेवाओं के लिए करते हैं जो दूसरों का उपभोग करते हैं। वैकल्पिक रूप से आप केवल वेब सेवा प्रसंस्करण के हिस्से के रूप में प्रमाणीकरण कोड कर सकते हैं।

यदि आपको डब्ल्यूएसई का उपयोग करना है तो आपको एसओएपी पैकेट भेजते समय addSOAPRequestHeader() का उपयोग करके एसओएपी हेडर का एक गुच्छा जोड़ना होगा, और फिर प्रतिक्रिया प्राप्त करते समय इन हेडर को जांचें। यह गंदा हो सकता है, लेकिन यहाँ कुछ कोड है कि हमारे लिए काम करता है:

<cffunction name="AddSecurityHeaders" access="public" returntype="any" hint="This adds the security headers as defined in the WS Security section of the WSS standard. Username and password are unencrypted." output="Yes"> 
     <cfargument name="webSvc" required="Yes" type="any" hint="This must be a vaild web service."> 
     <cfargument name="username" required="Yes" type="string" hint="Username required by webservice being called."> 
     <cfargument name="password" required="Yes" type="string" hint="Password required by web service being called."> 
     <cfargument name="action" required="Yes" type="string" hint="Value to be inseted into wsa:Action node."> 
     <cfargument name="to" required="Yes" type="string" hint="Value to be inseted into wsa:To node."> 
     <cfargument name="mustUnderstandSecurityHdr" required="No" type="boolean" default="false" hint="This value will be inserted into the <wsse:Security> header as the 'mustUnderstand' value."> 

     <cfscript> 

     var rightNow = "" ; 
     var expiryTime = "" ; 
     var objXmlAction = "" ; 
     var objXmlMessageID = "" ; 
     var objXmlTo = "" ; 
     var objXmlSecurity = "" ; 
     var objXmlReplyTo = "" ; 
     var objTimezone = CreateObject("component", "com.utils.timezone") ; 

     // Setup times (UTC/GMT only!) 
     rightNow = objTimezone.castToUTC(Now()) ; 
     expiryTime = DateAdd("n", 5, rightNow) ; 

     // Create XML doument and add required nodes starting with <wsa:Action> 
     objXmlAction = XmlNew() ; 
     objXmlAction.XmlRoot = XmlElemNew(objXmlAction, "http://schemas.xmlsoap.org/ws/2004/03/addressing", "wsa:Action") ; 
     objXmlAction.XmlRoot.XmlText = ARGUMENTS.action ; 

     // ..then <wsa:MessageID> 
     objXmlMessageID = XmlNew() ; 
     objXmlMessageID.XmlRoot = XmlElemNew(objXmlMessageID, "http://schemas.xmlsoap.org/ws/2004/03/addressing", "wsa:MessageID") ; 
     objXmlMessageID.XmlRoot.XmlText = "uuid:" & CreateUUID() ; 

     // ...then <wsa:Address> 
     objXmlReplyTo = XmlNew() ; 
     objXmlReplyTo.XmlRoot = XmlElemNew(objXmlReplyTo, "http://schemas.xmlsoap.org/ws/2004/03/addressing", "wsa:ReplyTo") ; 
     objXmlReplyTo.XmlRoot.XMLChildren[1] = XmlElemNew(objXmlReplyTo, "wsa:Address") ; 
     objXmlReplyTo.XmlRoot.XMLChildren[1].XmlText = "http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous" ; 

     // ..then <wsa:To> 
     objXmlTo = XmlNew() ; 
     objXmlTo.XmlRoot = XmlElemNew(objXmlTo, "http://schemas.xmlsoap.org/ws/2004/03/addressing", "wsa:To") ; 
     objXmlTo.XmlRoot.XmlText = ARGUMENTS.to ; 

     // ..then the main <wsse:Security> node which contains further info... 
     objXmlSecurity = XmlNew(true) ; 
     objXmlSecurity.XmlRoot = XmlElemNew(objXmlSecurity, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Security") ; 
     // ...note: this namespace is added as it is used in children nodes and this can help avoid XmlSearch errors in CFMX 
     //StructInsert(objXmlSecurity.XmlRoot.XmlAttributes, "xmlns:wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd") ; 

     // ...Timestamp, it's children and attributes 
     objXmlSecurity.XmlRoot.XMLChildren[1] = XmlElemNew(objXmlSecurity, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "wsu:Timestamp") ; 
     StructInsert(objXmlSecurity.XmlRoot.XMLChildren[1].XmlAttributes, "wsu:Id", "Timestamp-#CreateUUID()#") ; 

     objXmlSecurity.XmlRoot.XMLChildren[1].XmlChildren[1] = XmlElemNew(objXmlSecurity, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "wsu:Created") ; 
     objXmlSecurity.XmlRoot.XMLChildren[1].XmlChildren[1].XmlText = DateFormat(rightNow, "YYYY-MM-DD") & "T" & TimeFormat(rightNow, "HH:mm:ss") & "Z" ; 
     objXmlSecurity.XmlRoot.XMLChildren[1].XmlChildren[2] = XmlElemNew(objXmlSecurity, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "wsu:Expires") ; 
     objXmlSecurity.XmlRoot.XMLChildren[1].XmlChildren[2].XmlText = DateFormat(expiryTime, "YYYY-MM-DD") & "T" & TimeFormat(expiryTime, "HH:mm:ss") & "Z" ; 
     // ...Username token, attributes and children 
     objXmlSecurity.XmlRoot.XMLChildren[2] = XmlElemNew(objXmlSecurity, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:UsernameToken") ; 
     StructInsert(objXmlSecurity.XmlRoot.XMLChildren[2].XmlAttributes, "xmlns:wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd") ; 
     StructInsert(objXmlSecurity.XmlRoot.XMLChildren[2].XmlAttributes, "wsu:Id", "SecurityToken-#CreateUUID()#") ; 
     // ...UsernameToken.Username 
     objXmlSecurity.XmlRoot.XMLChildren[2].XmlChildren[1] = XmlElemNew(objXmlSecurity, "wsse:Username") ; 
     objXmlSecurity.XmlRoot.XMLChildren[2].XmlChildren[1].XmlText = Trim(ARGUMENTS.username) ; 
     // ...UsernameToken.Password 
     objXmlSecurity.XmlRoot.XMLChildren[2].XmlChildren[2] = XmlElemNew(objXmlSecurity, "wsse:Password") ; 
     StructInsert(objXmlSecurity.XmlRoot.XMLChildren[2].XmlChildren[2].XmlAttributes, "Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0##PasswordText") ; 
     objXmlSecurity.XmlRoot.XMLChildren[2].XmlChildren[2].XmlText = Trim(ARGUMENTS.password) ; 
     // ... Nonce 
     objXmlSecurity.XmlRoot.XMLChildren[2].XmlChildren[3] = XmlElemNew(objXmlSecurity, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "wsse:Nonce") ; 
     objXmlSecurity.XmlRoot.XMLChildren[2].XmlChildren[3].XmlText = ToBase64(CreateUUID()) ; 
     // ...Created 
     objXmlSecurity.XmlRoot.XMLChildren[2].XmlChildren[4] = XmlElemNew(objXmlSecurity, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "wsu:Created") ; 
     objXmlSecurity.XmlRoot.XMLChildren[2].XmlChildren[4].XmlText = DateFormat(rightNow, "YYYY-MM-DD") & "T" & TimeFormat(rightNow, "HH:mm:ss") & "Z" ; 

     // Add the created headers to the soap requests - note that the 2nd and 3rd parameters have no significance in this instance 
     addSOAPRequestHeader(ARGUMENTS.webSvc, "sia1", "hd1", "#objXmlAction#", false) ; 
     addSOAPRequestHeader(ARGUMENTS.webSvc, "sia1", "hd1", "#objXmlMessageID#", false) ; 
     addSOAPRequestHeader(ARGUMENTS.webSvc, "sia1", "hd1", "#objXmlReplyTo#", false) ; 
     addSOAPRequestHeader(ARGUMENTS.webSvc, "sia1", "hd1", "#objXmlTo#", false) ; 
     addSOAPRequestHeader(ARGUMENTS.webSvc, "sia1", "hd1", "#objXmlSecurity#", ARGUMENTS.mustUnderstandSecurityHdr) ; 

     return ARGUMENTS.webSvc ; 

     </cfscript> 

    </cffunction> 

यहाँ उपयोग की एक उदाहरण है:

// Create web service 
objWebSvc = CreateObject("webservice", "remoteWebService?WSDL") ; 

// Create security object and add the security header to our SOAP request 
objWSESecurity = CreateObject("component", "wse") ; 

objWebSvc = objWSESecurity.AddSecurityHeaders(
    webSvc=objWebSvc, 
    username="xxx", 
    password="yyy", 
    action="remoteAction", 
    to="remoteWebService", 
    mustUnderstandSecurityHdr=false 
) ; 

तुम देखो - कोड के बहुत सारे :) आशा है कि यह वैसे भी मदद करता है।

+0

जवाब देने के लिए धन्यवाद! मैं समझता हूं कि आपका कार्य क्या करता है लेकिन मुझे बिल्कुल यकीन नहीं है कि इसे कहां रखा जाए या इसे कैसे कॉल किया जाए। मैं इस तरह की मेरी वेबसाइसेस की सेवा कर रहा हूं http://mysite.com/news.cfc?wsdl - अब सीएफसी को कॉल को रोकने के लिए मुझे यह फ़ंक्शन कैसे प्राप्त करें? मेरे भ्रम के लिए खेद है और फिर धन्यवाद। – petron

+0

मैंने उपर्युक्त कोड अपडेट किया है, लेकिन यह ध्यान रखना दिलचस्प है कि हम इस एकीकरण के साथ डब्लूएसई से दूर चले गए हैं - इसे संकट के स्रोत के रूप में देखा गया था और प्रयास के लायक नहीं था। वे अब हमारे प्रमाणीकरण प्रमाण-पत्रों के आधार पर उनके सेवा अनुरोध के हिस्से के रूप में प्रमाणित करते हैं। –

संबंधित मुद्दे