WS-Security で保護された WS エンドポイントを作成しました。クライアント認証は、PasswordDigest パスワード タイプの UsernameToken に基づいています (残念ながら、証明書ベースの認証はオプションではありません。レガシー クライアントがいくつかあります)。
SOAP リクエストの例を次に示します。
<soapenv:Envelope>
<soapenv:Header>
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>XXX</wsse:Username>
<wsse:Password>vCsshCTkiz07lpCZXVYgwXPU7n4=</wsse:Password>
<wsse:Nonce>fsf9Vc2YNErZy4Cc2wcYjw==</wsse:Nonce>
<wsu:Created>2013-06-06T09:31:16.757Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<rem:start>
<xxx>111</xxx>
</rem:start>
</soapenv:Body>
</soapenv:Envelope>
私が理解しているように、パスワードはBase64(SHA(Nonce + Created + ClearTextPassword))として生成されます。
CXF フレームワークに正しい平文パスワードを与えるための CXF PasswordCallback を実装しているので、ダイジェスト値を計算し、提供されたものと比較できます。
public class PasswordCallbackHandler implements CallbackHandler {
@Override
public void handle(final Callback[] callbacks) throws IOException, UnsupportedCallbackException {
final WSPasswordCallback passwordCallback = (WSPasswordCallback) callbacks[0];
passwordCallback.setPassword("cleartextpassword");
}
}
私の懸念は、パスワード値をプレーンテキストとして設定する必要があることです。そのため、それらを (私のユースケース: データベースに) クリアテキストで保存する必要があります。
これは、この PasswordDigest シナリオで得られる最高のものだと感じていますが、より良い代替手段があるかどうかを知りたいと思っています...
ありがとう!
M.