2012-04-21 2 views
2

웹 서비스 용 클라이언트를 만드는 중입니다.WSSecurityEngine은 콜백 중에 암호가 제공되지 않았다고 말합니다.

  • 하게 IntelliJ IDEA의 IDE
  • 아파치 축
  • 아파치 WSS4J 1.5.1
  • 아파치 XML 보안 1.4 :

    AxisFault 
        faultCode: {http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}InvalidSecurity 
        faultSubcode: 
        faultString: 
         Security Data : General security error (WSSecurityEngine: Callback supplied no password for: TestMerchant) 
        faultActor: 
        faultNode: 
        faultDetail: {http://xml.apache.org/axis/} 
        stackTrace: 
         Security Data : General security error (WSSecurityEngine: Callback supplied no password for: TestMerchant) 
    

    이 여기 내 환경은 : 나는 다음과 같은 오류가 계속. 0

  • JDK 1.6
  • 최대 OS X

XML 검색을 통해 보안 헤더를 요청에 추가하는 방법에 대한 예제가 인터넷에서 검색되지만 내 요구 사항은 프로그램을 통해 동적으로 수행하는 것입니다. 당신은 위에서 볼 수 있듯이

public class AxisClient implements CallbackHandler { 

    ServerEnvironment environment; 

    AxisClient(ServerEnvironment environment) { 
     this.environment = environment; 
    } 

    public enum ServerEnvironment { 
     LIVE("https://ics2ws.ic3.com/commerce/1.x/transactionProcessor"), 
     TEST("https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor"); 

     String url; 

     ServerEnvironment (String url) { 
      this.url = url; 
     } 

     public String getUrl() { 
      return url; 
     } 
    } 

    public enum Merchant { 
     TestMerchant ("testpassword"); 

     private String transactionKey; 

     Merchant(String transactionKey) { 
      this.transactionKey = transactionKey; 
     } 

     public String getTransactionKey() { 
      return transactionKey; 
     } 
    } 

    public static void main(String[] argv) { 
     String ani = "7162502800"; 
     String zipCode = "14221"; 
     String ccNum ="5555555555554444"; 
     String expMonth = "01"; 
     String expYear = "15"; 
     String cvv = "123"; 
     String unitPrice = "9.99"; 
     String qty = "2"; 

     try { 
      new AxisClient(ServerEnvironment.TEST).doAuth(Merchant.TestMerchant, ani, zipCode, ccNum, expMonth, expYear, cvv, String.valueOf(new Date().getTime()), unitPrice, qty); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public Boolean doAuth(Merchant merchant, String ani, String zipCode, String ccNum, String expMonth, String expYear, String cvv, String id, String unitPrice, String qty) throws Exception { 
     Boolean result = false; 

     RequestMessage request; 
     BillTo billTo; 
     Card card; 
     PurchaseTotals purchaseTotals; 
     Item item; 
     Item[] items; 
     ReplyMessage reply; 

     try { 
      // billing info 
      billTo = new BillTo(); 
      billTo.setPhoneNumber(ani); 
      billTo.setPostalCode(zipCode); 

      // card info 
      card = new Card(); 
      card.setAccountNumber(ccNum); 
      card.setExpirationMonth(new BigInteger(expMonth)); 
      card.setExpirationYear(new BigInteger(expYear)); 
      card.setCvNumber(cvv); 

      // currency info 
      purchaseTotals = new PurchaseTotals(); 
      purchaseTotals.setCurrency("USD"); 

      // item 
      item = new Item(); 
      item.setId(new BigInteger(id)); 
      item.setUnitPrice(unitPrice); 
      item.setQuantity(new BigInteger(qty)); 

      // add item to items array 
      items = new Item[1]; 
      items[0] = item; 

      // create our request 
      request = new RequestMessage(); 
      request.setMerchantID(merchant.toString()); 
      request.setCcAuthService(new CCAuthService()); 
      request.getCcAuthService().setRun("true"); 

      // add request specific params 
      request.setBillTo(billTo); 
      request.setCard(card); 
      request.setPurchaseTotals(purchaseTotals); 
      request.setItem(items); 

      reply = post(merchant, request); 

      if (reply != null) { 
       System.out.println(ReflectionToStringBuilder.toString(reply, ToStringStyle.MULTI_LINE_STYLE)); 
      } 
     } 
     catch (Exception e) { 
      throw e; 
     } 

     return result; 
    } 

    public EngineConfiguration createConfigurationWithSecurityHeaders(Merchant merchant) throws Exception { 
     SimpleProvider result; 

     Handler securityHandler; 
     SimpleChain requestHandler; 
     SimpleChain responseHandler; 
     Handler pivot; 
     Handler transport; 

     try { 
      result = new SimpleProvider(); 

      securityHandler = new WSDoAllSender(); 
      securityHandler.setOption(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); 
      securityHandler.setOption(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PASSWORD_TEXT); 
      securityHandler.setOption(WSHandlerConstants.PW_CALLBACK_REF, this); 
      securityHandler.setOption(WSHandlerConstants.USER, merchant.toString()); 
      securityHandler.setOption(WSHandlerConstants.MUST_UNDERSTAND, "false"); 

      requestHandler = new SimpleChain(); 
      requestHandler.addHandler(securityHandler); 

      responseHandler = new SimpleChain(); 
      responseHandler.addHandler(securityHandler); 

      pivot = new HTTPSender(); 

      transport = new SimpleTargetedChain(requestHandler, pivot, responseHandler); 

      result.deployTransport(HTTPTransport.DEFAULT_TRANSPORT_NAME, transport); 
     } 
     catch (Exception e) { 
      throw e; 
     } 

     return result; 
    } 

    public ReplyMessage post (Merchant merchant, RequestMessage request) throws Exception { 
     ReplyMessage result; 

     TransactionProcessorLocator locator; 
     URL endPoint; 
     ITransactionProcessorStub stub; 
     EngineConfiguration configuration; 

     try { 
      locator = new TransactionProcessorLocator(); 

      // use client config 
      configuration = createConfigurationWithSecurityHeaders(merchant); 
      locator.setEngineConfiguration(configuration); 
      locator.setEngine(new org.apache.axis.client.AxisClient(configuration)); 

      endPoint = new URL(environment.getUrl()); 

      stub = (ITransactionProcessorStub) locator.getportXML(endPoint); 
      stub._setProperty(WSHandlerConstants.USER, request.getMerchantID()); 
      stub._setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); 
      stub._setProperty(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PASSWORD_TEXT); 
      stub._setProperty(WSHandlerConstants.PW_CALLBACK_REF, this); 
      stub._setProperty(WSHandlerConstants.MUST_UNDERSTAND, "false"); 

      result = stub.runTransaction(request); 
     } 
     catch (Exception e) { 
      throw e; 
     } 

     return result; 
    } 

    @Override 
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { 

     for (Callback callback : callbacks) { 

      System.out.println(ReflectionToStringBuilder.toString(callback, ToStringStyle.MULTI_LINE_STYLE)); 

      if (callback instanceof WSPasswordCallback) { 

       WSPasswordCallback passwordCallback = (WSPasswordCallback) callback; 

       switch (Merchant.valueOf(passwordCallback.getIdentifer())) { 

        case TestMerchant: 
         passwordCallback.setPassword(Merchant.TestMerchant.getTransactionKey()); 
         System.out.println(ReflectionToStringBuilder.toString(passwordCallback, ToStringStyle.MULTI_LINE_STYLE)); 
         break; 

        default: 
         throw new UnsupportedCallbackException(callback, "Unrecognized prompt!"); 
       } 
      } 
      else { 
       throw new UnsupportedCallbackException(callback, "Unrecognized callback!"); 
      } 
     } 
    } 
} 

, 내 클래스의 CallbackHandler 구현하는 내가 핸들을 무시하고있어() WSPasswordCallback의 암호를 제공합니다 : 그래서 여기 내 코드입니다. 그래서

[email protected][ 
    identifier=TestMerchant 
    password=testpassword 
    key=<null> 
    usage=2 
    passwordType=<null> 
] 

정말 아니에요 : 암호를 설정 한 후을 위해 여기

[email protected][ 
    identifier=TestMerchant 
    password=<null> 
    key=<null> 
    usage=2 
    passwordType=<null> 
] 

출력입니다 : 여기

내가 먼저 콜백 얻을 때의 인쇄 문의 출력은 왜 내가 그 오류 메시지를 계속 받게되는지. 이 문제를 해결하는 데 도움이 될 것입니다 크게 감사하겠습니다.

다른 접근 방법 (axis2, cxf)에 대한 권장 사항도 환영합니다.

AxisFault 
faultCode: {http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}InvalidSecurity 
faultSubcode: 
faultString: 
Security Data : General security error (WSSecurityEngine: Callback supplied no password for: TestMerchant) 
General security error (WSSecurityEngine: Callback supplied no password for: TestMerchant) 

faultActor: 
faultNode: 
faultDetail: 
    {http://xml.apache.org/axis/}stackTrace: 
Security Data : General security error (WSSecurityEngine: Callback supplied no password for: TestMerchant) 
General security error (WSSecurityEngine: Callback supplied no password for: TestMerchant) 

    at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222) 
    at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129) 
    at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2939) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:395) 
    at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) 
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) 
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) 
    at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62) 
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206) 
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784) 
    at org.apache.axis.client.Call.invoke(Call.java:2767) 
    at org.apache.axis.client.Call.invoke(Call.java:2443) 
    at org.apache.axis.client.Call.invoke(Call.java:2366) 
    at org.apache.axis.client.Call.invoke(Call.java:1812) 
    at itg.cybersource.axis.ITransactionProcessorStub.runTransaction(ITransactionProcessorStub.java:1284) 
    at itg.AxisClient.post(AxisClient.java:208) 
    at itg.AxisClient.doAuth(AxisClient.java:132) 
    at itg.AxisClient.main(AxisClient.java:75) 

    {http://xml.apache.org/axis/}hostname:C02GD302DRJL.local 


Security Data : General security error (WSSecurityEngine: Callback supplied no password for: TestMerchant) 
General security error (WSSecurityEngine: Callback supplied no password for: TestMerchant) 

    at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222) 
    at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129) 
    at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:601) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2939) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:395) 
    at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) 
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) 
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) 
    at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62) 
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206) 
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784) 
    at org.apache.axis.client.Call.invoke(Call.java:2767) 
    at org.apache.axis.client.Call.invoke(Call.java:2443) 
    at org.apache.axis.client.Call.invoke(Call.java:2366) 
    at org.apache.axis.client.Call.invoke(Call.java:1812) 
    at itg.cybersource.axis.ITransactionProcessorStub.runTransaction(ITransactionProcessorStub.java:1284) 
    at itg.AxisClient.post(AxisClient.java:208) 
    at itg.AxisClient.doAuth(AxisClient.java:132) 
    at itg.AxisClient.main(AxisClient.java:75) 

답변

4

매우 많은 다른 일을 시도 많은 일 후, 나는 마침내 내 문제에 대한 답을 알아 낸 : 그것은 어떤 도움 인 경우

여기 내 전체 스택 추적입니다. 키보드와 의자 사이에있는 문제에 대해 이야기하십시오 !!!!!

그래서 여기 속히 문제가 무엇인지입니다 :

securityHandler.setOption(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PASSWORD_TEXT); 

지금 WSConstants.PASSWORD_TEXT 실제로 "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText" 동일합니다. 내가 실제로 사용하고있는 것은 WSConstants.PW_TEXT이고 이는 정확히 내 코드에서 필요한 것인 "PasswordText"과 같습니다. 일단 변경을하면 모든 것이 아름답게 작동합니다.

일반적으로 생각한 것과는 달리 모든 것을 프로그램 방식으로 수행 할 수 있습니다. 메시지를 가로 채고 SOAP 헤더에서 WS-Security를 ​​처리 할 수 ​​있도록 WSDD xml을 구성 할 필요가 없습니다. 느슨해 진 부분을 정돈하려면 다음과 같이 수정 된 메소드가 표시됩니다.

이러한 수정이 완료되면 클라이언트가 작동합니다. 위의 몇 가지 설정은 내가 통합 할 서비스에만 해당된다는 점을 명심하십시오.약간의 시행 착오가 필요할 수있는 통합에 맞게 조정해야 할 수도 있습니다.

내게와 같은 사용자를 가능케하는 엄청난 지식의 기사를 게시 한 모든 사람들에게 다시 한번 감사드립니다.

관련 문제