Apache CXF を使用して Web サービス要求の HTTP Authorization ヘッダーを設定する際に問題が発生しています。春までにクライアントをセットアップしました:
<bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
<bean id="myHTTPAuthInterceptor" class="my.app.MyHTTPAuthInterceptor" autowire="constructor" />
<bean id="webServiceFactory" class="my.app.WebServiceFactory">
<property name="wsdlLocation" value="classpath:/my/app/webservice.wsdl" />
<property name="serviceURL">
<jee:jndi-lookup jndi-name="webservice/url" />
</property>
<property name="inInterceptors">
<list>
<ref bean="loggingInInterceptor" />
</list>
</property>
<property name="outInterceptors">
<list>
<ref bean="loggingOutInterceptor" />
<ref bean="myHTTPAuthInterceptor" />
</list>
</property>
</bean>
<bean id="myWebService" factory-bean="webServiceFactory" factory-method="getInstance" />
ヘッダーは、次のように MyHTTPAuthInterceptor を介して設定されます。
public MyHTTPAuthInterceptor(ConfigDao configDao)
{
super(Phase.POST_PROTOCOL);
this.configDao = configDao;
}
@Override
public void handleMessage(Message message) throws Fault
{
Map<String, List<?>> headers = (Map<String, List<?>>) message.get(Message.PROTOCOL_HEADERS);
String authString = configDao.getUsername() + ":" + config.getPassword();
headers.put("Authorization", Collections.singletonList("Basic " + new String(Base64.encodeBase64(authString.getBytes()))));
}
ユーザー名と両方を「test」に設定すると、ログですべて問題ないように見えます。
Headers: {SOAPAction=[""], Accept=[*/*], Authorization=[Basic dGVzdDp0ZXN0]}
ただし、サーバーは HTTP 401: Unauthorized を返します。
何が問題なのかわからないので、Web サービス クライアント ファクトリ コードを変更するというまったく別のアプローチを取りました。次のように、クライアントのコンジットに基本的な承認ポリシーを追加しました。
HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();
authorizationPolicy.setUserName("test");
authorizationPolicy.setPassword("test");
authorizationPolicy.setAuthorizationType("Basic");
httpConduit.setAuthorization(authorizationPolicy);
セットアップを再度テストしましたが、同じログです (順序は異なります):
Headers: {SOAPAction=[""], Authorization=[Basic dGVzdDp0ZXN0], Accept=[*/*]}
サーバーの応答は 200 OK です。
問題は解決したと思うかもしれませんが、2 番目のアプローチは実際にはうまくいきません。私のアプリケーションはマルチテナント環境で、すべて異なるユーザー名とパスワードを使用しています。2 番目のアプローチでは、クライアントを再利用できません。
インターセプターを正しく動作させるにはどうすればよいですか? 間違ったフェーズに差し込んでいますか? ヘッダーの順序は重要ですか? もしそうなら、どうすれば変更できますか?