2011-06-22 17 views
6

インライン認証を使用するColdFusionを使用してWebサービスで既存のAPIを作成しましたが、何らかの認証を使用してセキュリティを確保したいと考えています。ColdFusionで安全なWebサービスを作成する

Webサービスは、ColdFusionによって、cfcsの最後に?wsdlを追加することによって自動生成されます。

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

しかし、私は、私が使用したいと思う:次のように身体を:私は、各Webサービス呼び出しのためのクライアントがsoapenv内を通過/キーに合格しなければならないことを意味する「」と言う

WS-Securityまたは基本認証ですが、私は何をしているのか分かりません。

私はCFコミュニティで尋ねていることを誰もしていないようですが、それは奇妙に思えます。

答えて

3

私はWSE(http://oasis-open.org/)やSOAPのファンではありませんが、統合の際に役立つことがあります。たとえば、.NET Webサービスの使用時に使用しています。

ウェブサービスと同じディレクトリにApplication.cfcを使用して、IPとセキュリティトークンまたはユーザー名/パスワードによる要求を認証することが優先です。これを、他の人が消費するRESTful Webサービスに使用します。あるいは、Webサービスの処理自体の一部として認証をコード化することもできます。

WSEを使用する必要がある場合は、SOAPパケットを送信するときにaddSOAPRequestHeader()を使用して一連のSOAPヘッダーを追加し、応答を取得するときにこれらのヘッダーを確認する必要があります。これは厄介なことができますが、ここで私たちのために働くいくつかのコードです:

ここ
<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のような私のwebservicesを提供しています - 今どのように私はこの関数をcfcへの呼び出しを傍受するようになるのですか?私の混乱と感謝再び申し訳ありません。 – petron

+0

私は上記のコードを更新しましたが、この統合でWSEから離脱したことに注目するのは興味深いことです。これは問題の原因と見なされ、努力する価値はありません。私たちが渡す認証資格情報に基づいてサービス要求の一部として認証されるようになりました。 –

関連する問題