挑戦する
特定のプロトコルを使用してデータを要求できるアプリケーションがあり、データを送信できるサービスがありますが、別のプロトコルを使用しており、ログインとパスワードによる認証が必要です。
アプリケーションには、サービスにアクセスするために必要な資格情報がありません。 友達をアプリケーションとサービスにする必要があります。
解決策
バス:
WSO2 Enterprise Service Busを使用して、プロキシサービスを構成します。
WSO2 ESBバージョン4.7.0を使用します。
ポリシーを作成する
ターゲットサービスはWS-Security標準に従って保護されているため、このサービスへのアクセスを標準の最大限の範囲で構成します。
ポリシーは、インターフェイスのローカルリポジトリのリソースとして作成されます。管理-サービスバス-ローカルエントリ-ローカルエントリの追加-インラインXMLエントリの追加。
発信ポリシー
ここおよび将来、名前は任意に指定できますが、すべてのアーティファクトがリンクされるため、それらに焦点を当てます
名前を指定:
service-policyポリシーを指定します。
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UTOverTransport"> <wsp:ExactlyOne> <wsp:All> <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <wsp:Policy> <sp:TransportToken> <wsp:Policy> <sp:HttpsToken RequireClientCertificate="false"/> </wsp:Policy> </sp:TransportToken> <sp:AlgorithmSuite> <wsp:Policy> <sp:Basic128/> </wsp:Policy> </sp:AlgorithmSuite> <sp:Layout> <wsp:Policy> <sp:Lax/> </wsp:Policy> </sp:Layout> <sp:IncludeTimestamp/> </wsp:Policy> </sp:TransportBinding> <sp:SignedSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <wsp:Policy> <sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"/> </wsp:Policy> </sp:SignedSupportingTokens> <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy"> <ramp:user>MyUsername</ramp:user> <ramp:passwordCallbackClass>serPasswordCallbackHandler</ramp:passwordCallbackClass> </ramp:RampartConfig> </wsp:All> </wsp:ExactlyOne> </wsp:Policy>
このポリシーの主な部分は、ターゲットサービスのユーザー名とクラスを指定することです。この場合、必要なパスワード、
serPasswordCallBackHandlerクラスを単純に置き換えます。
package ser; import org.apache.ws.security.WSPasswordCallback; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.UnsupportedCallbackException; import java.io.IOException; public class PasswordCallBackHandler implements CallbackHandler { private static final String PASSWORD = "MyPassword"; @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (Callback callback : callbacks) { if (callback instanceof WSPasswordCallback) { WSPasswordCallback pc = (WSPasswordCallback) callback; if (pc.getUsage() == WSPasswordCallback.USERNAME_TOKEN_UNKNOWN) { if (pc.getPassword().equals(PASSWORD)) return; throw new UnsupportedCallbackException(callback, "Check failed"); } pc.setPassword(PASSWORD); } else { throw new UnsupportedCallbackException(callback, "Unrecognized Callback"); } } } }
jarにパックし、WSO2_HOME / repository / components / lib /に配置します。
WSO2を再起動します。
受信トレイポリシー
名前を指定します:
empty-policy 。
ポリシーを指定します。
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UTOverTransport"> <wsp:ExactlyOne> <wsp:All> <sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <wsp:Policy/> </sp:TransportBinding> <sp:SignedSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <wsp:Policy/> </sp:SignedSupportingTokens> </wsp:All> </wsp:ExactlyOne> </wsp:Policy>
アドレスエンドポイントを作成する
名前
my-endpointを指定し
ます 。
サービスのアドレスを指定します。
追加のオプションでは、WS-Securityの使用に注意し、以前に作成した送信メッセージと受信メッセージのポリシーを指定します。
エンドポイントソース:
<endpoint name="my-endpoint"> <address uri="http://service/soap/"> <enableSec inboundPolicy="empty-policy" outboundPolicy="service-policy"/> </address> </endpoint>
XSLTメッセージ変換を作成する
XSLT変換は、政治家と同じ場所で作成されます。管理-サービスバス-ローカルエントリ-ローカルエントリの追加-インラインXMLエントリの追加。
受信メッセージを変換する
アプリケーションのリクエストを、サービスが理解できるビューに持ってくる必要があります。
名前を示します:
in-xslt変換を指定します。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> </xsl:template> </xsl:stylesheet>
送信メッセージに変換
サービスの応答を、アプリケーションが理解できる形式にする必要があります。 このステップは、名前:
out-xsltのみが着信メッセージのステップと同じです。
プロキシサービスを作成する
UIの場合:管理-サービス-追加-プロキシサービス-カスタムプロキシ
名前を
external-serviceに指定し
ます 。 この名前で、たとえば
localhost :8280 / services / external-serviceのように、バスでサービスを利用できます。
この場合、httpsプロトコルのチェックを外します。
次に、ソースモードに切り替え(ソースビューに切り替え)、コンテンツを次のようにします。
<?xml version="1.0" encoding="UTF-8"?> <proxy xmlns="http://ws.apache.org/ns/synapse" name="external-service" transports="http" statistics="disable" trace="disable" startOnLoad="true"> <target faultSequence="fault" endpoint="my-endpoint"> <inSequence> <xslt key="in-xslt"/> <send> <endpoint key="my-endpoint"/> </send> </inSequence> <outSequence> <xslt key="out-xslt"/> <send/> </outSequence> </target> <description/> </proxy>
着信メッセージと発信メッセージには2つのシーケンスがあり、どちらも適切な変換で始まり、正しい方向にメッセージを送信します。
できた!
オプショナル
プロキシメッセージの変化を監視するには、フィドラーを使用しました
構成方法と最終メッセージを見る場所が見つからなかったからです。
フィドラーの詳細:
プロキシはアプリケーションから送信されたActionヘッダーを転送しますが、サービスは誓いますか?
プロキシサービスシーケンスにメディエーターを追加し、アクションヘッダーを削除します。
<inSequence> <xslt key="in-xslt"/> <header name="Action" value=""/> <property name="SOAPAction" value="" scope="transport"/> <send> <endpoint key="my-endpoint"/> </send> </inSequence>
プロキシは間違ったエンコーディングでデータを返しますか?
メッセージを返すエンコードを指定します。
<outSequence> <xslt key="out-xslt"/> <property name="messageType" value="text/xml;charset=windows-1251" scope="axis2" type="STRING"/> <send/> </outSequence>
サービスの応答はいくつかの部分で構成されていますか?
例:
<soapenv:Envelope> <soapenv:Body> <part1/> <part2/> </soapenv:Body> </soapenv:Envelope>
WSO2は、デフォルトでは、答えは1つの部分で構成されると見なします。したがって、パスに沿った変換を渡します。 s12:Body / child :: * [position()= 1]、結果として最初の部分のみを変換できるため、これを修正するために、サービス内のコンバーターの呼び出しを変更します。
<outSequence> <xslt xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" key="stav-out-xslt" source="SOAP-ENV:Body"/> <send/> </outSequence>
...そして、コンバータでこれを考慮します:
<xsl:stylesheet> <xsl:template match="."> <xsl:apply-templates select="/part1"/> <xsl:apply-templates select="/part2"/> </xsl:template> <xsl:template match="part1"/> <xsl:template match="part2"> <forbody> </forbody> </xsl:template> </xsl:stylesheet>
未解決の問題
2つのセキュリティポリシーを構成する必要がありました
単独でそれを行うことができるという感覚がありますが、単一のポリシーでは、サービスの応答にセキュリティヘッダーが含まれていないというエラーがありました。 しかし、彼は本当にそれらを含んでいません。 これを回避するには、回答用の空のポリシーを作成する必要がありました。
サードパーティの資格情報を保存するための組み込みソリューションが見つかりませんでした
パスワードストレージクラスを使用した不器用なソリューションは、組み込みまたは自転車のいずれかの適切なソリューションと交換する必要がある明らかな松葉杖です。
まとめ
- 変換部分は問題を引き起こしませんでしたが、構成がUI全体に非常に広がっている点が異なります。 もちろん、同じUIで単一のxmlを使用して構成できますが、この場合、構成はxmlに分散されます。
- 最も単純なタスクを解決するためのかなり高いエントリーしきい値。
- 問題は解決しました!