cxf-soapws客户端请求中的http头中传递oauth2承载令牌

7bsow1i6  于 2021-10-10  发布在  Java
关注(0)|答案(0)|浏览(280)

创建一个out拦截器并将其注册到ws-client是可行的((参考)

public class OAuth2OutInterceptor extends
AbstractPhaseInterceptor<Message> {
         private String token;
         public OAuth2OutInterceptor(String token) {
             super(Phase.WRITE);
             this.token = token;
         }

         public void handleMessage(Message message) throws Fault {
             Map<String, List<String>> headers = CastUtils.cast((Map<?,
?>)message.get(Message.PROTOCOL_HEADERS));
             headers.put("Authorization",
Collections.singletonList("Bearer " + token));
         }

     }

输出拦截器注册到实际服务(authenticatorwebservice),如下所示。

ClientProxyFactoryBean factory = new JaxWsProxyFactoryBean();
            factory.setServiceClass(AuthenticatorWebService.class);
            factory.setAddress(urlPath);

            AuthenticatorWebService authenticator = (AuthenticatorWebService) factory.create();

            Client proxy = ClientProxy.getClient(authenticator);
            OAuth2OutInterceptor interceptor = new OAuth2OutInterceptor(token);
            proxy.getOutInterceptors().add(interceptor);
            Object[] authenticates = proxy.invoke("authenticate", username, password);
            Optional<Object> objs = Arrays.stream(authenticates).findFirst();
            if (objs.isPresent()) {
                output = objs.get().toString();
            }

此实现有两个潜在的缺点:
proxy.invoke将实际方法用作字符串。最好使用静态绑定而不是动态绑定。
proxy.invoke返回一个对象数组。最好是直接获取实际响应,而不是像上面提到的那样解析对象数组。
想知道是否有另一种方法可以以更优雅的方式在http头中传递承载令牌。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题