SOAP-безопасность в Salesforce - PullRequest
1 голос
/ 16 февраля 2011

Я пытаюсь изменить код wsdl2apex для заголовка вызова веб-службы, который в настоящее время выглядит следующим образом:
<env:Header><br> <Security xmlns="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd"><br> <UsernameToken Id="UsernameToken-4"><br> <Username>test</Username><br> <Password>test</Password><br> </UsernameToken><br> </Security><br> </env:Header>

чтобы выглядеть так:
<soapenv:Header><br> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><br> <wsse:UsernameToken wsu:Id="UsernameToken-4" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><br> <wsse:Username>Test</wsse:Username><br> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Test</wsse:Password><br> </wsse:UsernameToken><br> </wsse:Security><br> </soapenv:Header>

Одна проблема заключается в том, что я не могу понять, как изменить пространства имен для элементов (или даже если имеет значение, какое у них имя). Еще одна проблема - поместить атрибут Type в элемент Password.

Может ли кто-нибудь предоставить какую-либо информацию, которая может помочь?

Спасибо

Ответы [ 3 ]

4 голосов
/ 23 апреля 2013

У меня была похожая проблема.Мне удалось сгенерировать следующий заголовок SOAP, который работал для моей реализации:

   <env:Header>
      <Security xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
         <UsernameToken>
            <Username>aaaaaa</Username>
            <Password>xxxxxx</Password>
            <Nonce>MzI3MTUzODg0MjQy</Nonce>
            <wsu:Created>2013-04-23T16:09:00.701Z</wsu:Created>
         </UsernameToken>
      </Security>
   </env:Header>

Класс безопасности:

public class OasisOpenOrgWssSecuritySecext 
{

    // UserToken Class
    public class UsernameToken 
    {
        // Constructor for UsernameToken used to pass in username and password parameters
        public UsernameToken(String username, String password)
        {
            this.Username = username;
            this.Password = password;
            this.Nonce = generateNounce();
            this.Created = generateTimestamp();
        }

        public String Username;
        public String Password;
        public String Nonce;
        public String Created;
        private String[] Username_type_info = new String[]{'Username','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
        private String[] Password_type_info = new String[]{'Password','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
        private String[] Nonce_type_info = new String[]{'Nonce','http://www.w3.org/2001/XMLSchema','string','0','1','false'};
        private String[] Created_type_info = new String[]{'wsu:Created','http://www.w3.org/2001/XMLSchema','string','0','1','false'};        
        private String[] apex_schema_type_info = new String[]{'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','true','false'};
        private String[] field_order_type_info = new String[]{'Username','Password','Nonce','Created'};

        // Generate Nounce, random number base64 encoded
        public String generateNounce()
        {
            Long randomLong = Crypto.getRandomLong();
            return EncodingUtil.base64Encode(Blob.valueOf(String.valueOf(randomLong)));
        }

        // Generate timestamp in GMT
        public String generateTimestamp()
        {
            return Datetime.now().formatGmt('yyyy-MM-dd\'T\'hh:mm:ss\'Z\'');
        }
    }

    // SecurityHeaderType Class
    public class SecurityHeaderType 
    {       
        // Constructor for SecurityHeaderType used to pass in username and password parameters and instantiate the UsernameToken object     
        public SecurityHeaderType(String username, String password)
        {
            this.UsernameToken = new OasisOpenOrgWssSecuritySecext.UsernameToken(username, password);
        }

        public String wsuNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';              
        public OasisOpenOrgWssSecuritySecext.UsernameToken UsernameToken;
        private String[] UsernameToken_type_info = new String[]{'UsernameToken','http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','UsernameToken','1','1','false'};
        private String[] wsuNamespace_att_info = new String[]{'xmlns:wsu'};               
        private String[] apex_schema_type_info = new String[]{'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd','true','false'};
        private String[] field_order_type_info = new String[]{'UsernameToken'};
    }
}

Добавьте строки между комментариями к вашему классу, сгенерированному wsdl2apex:

public class XyzWebService {
    public String endpoint_x = 'https://webservice/'
    // ADDITION TO WSDL
    public OasisOpenOrgWssSecuritySecext.SecurityHeaderType Security = new OasisOpenOrgWssSecuritySecext.SecurityHeaderType( 'aaaaaa', 'xxxxxx');
    private String Security_hns = 'Security=http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';**                            
    // END ADDITION TO WSDL
    public Map<String,String> inputHttpHeaders_x;
    public Map<String,String> outputHttpHeaders_x;
    public String clientCertName_x;
    public String clientCert_x;
    public String clientCertPasswd_x;
    public Integer timeout_x;
1 голос
/ 17 февраля 2011

У меня была похожая проблема. Я вручную создал класс для создания базовой структуры. К счастью, служба, которую я потреблял, либо предполагала, либо смогла определить, что тип был текстовым без явного указания параметра типа, поэтому вы можете попробовать это и посмотреть, работает ли он.

Для пространств имен я устанавливаю их как атрибуты:

private String[] wsu_att_info = new String[] {'xmlns:wsu'};

Этот вопрос также может быть полезен: Каковы параметры для метода Salesforce WebServiceCallout.invoke?

0 голосов
/ 08 марта 2011

Возможно, это будет невозможно для всех, но нам удалось решить проблему, используя XSLT для преобразования SOAP, который у нас был, в SOAP, который мы хотели.

...