Любой хороший пример для интеграции Salesforce в Azure Blob с использованием кода APEX - PullRequest
0 голосов
/ 12 марта 2020

Спасибо, что сначала прочитали мой вопрос. Я сталкиваюсь с трудностями при подключении к Azure Blob из класса Salesforce APEX.

Я следую этому примеру и следую по ссылке для справки https://github.com/nagensahu/AzureBlobStorage-Salesforce/blob/master/Readme.md

public class AzureService {




    public static AzureService.AzureWrapper signedsignature(AzureService.AzureWrapper wrapRec, Datetime timestamp, String fileName, String fileType, Integer fileLength){
        wrapRec.timestamp = timestamp.formatGMT('EEE, dd MMM yyyy HH:mm:ss z');
        wrapRec.fileName = EncodingUtil.urlEncode(fileName, 'UTF-8');
        wrapRec.fileLength = String.valueof(fileLength);
        wrapRec.fileType = fileType;
        string canonHeaders = 'x-ms-blob-type:BlockBlob\nx-ms-date:'+wrapRec.timestamp+'\nx-ms-version:2015-12-11\n';

        System.debug('canonHeaders-->'+canonHeaders);

        string canonRes = '/'+wrapRec.storageName+'/'+wrapRec.container+'/'+wrapRec.fileName;
        System.debug('canonRes-->'+canonRes);

        string stringToSign = 'PUT';
        stringToSign +='\n\n\n';
        stringToSign+=wrapRec.fileLength;
        stringToSign+='\n\n';
        stringToSign+=wrapRec.fileType;
        stringToSign+=';charset=UTF-8\n\n\n\n\n\n\n';
        stringToSign+=+canonHeaders;
        stringToSign+=canonRes;

        System.debug('stringToSign-->'+stringToSign);
        //System.debug('wrapRec.storageKey-->'+wrapRec.storageKey);
        // Sign the request
        Blob temp = EncodingUtil.base64Decode(wrapRec.storageKey);
        Blob hmac = Crypto.generateMac('HMacSHA256', Blob.valueOf(stringToSign), temp);
        wrapRec.signature = EncodingUtil.base64Encode(hmac);
        System.debug('wrapRec.signature-->'+wrapRec.signature);
        return wrapRec;
    }

    /*
    public static void generateSharedKey(String strToSign, String key, String Account){

        string canonHeaders = 'x-ms-blob-type:BlockBlob\nx-ms-date:'+wrapRec.timestamp+'\nx-ms-version:2015-12-11\n';
        string canonRes = '/'+wrapRec.storageName+'/'+wrapRec.container+'/'+wrapRec.fileName;
        string signature;
        Blob unicodeKey = EncodingUtil.base64Decode(key);
        Blob hmac = Crypto.generateMac('HMacSHA256', Blob.valueOf(signature), temp);

    }
    */
     public static boolean uploadToAzure(AzureService.AzureWrapper wrapRec, Blob fileBody){
        boolean response = false;
        HttpRequest req = new HttpRequest();
            req.setTimeout(120000);
            req.setMethod('PUT');
            req.setHeader('x-ms-blob-type', 'BlockBlob');
           req.setHeader('x-ms-date', wrapRec.timestamp);
         System.debug('wrapRec.timestamp--->. '+wrapRec.timestamp);
            string authHeader = 'SharedKey '+wrapRec.storageName+':'+ wrapRec.signature;
        System.debug('AuthHeader--->. '+authHeader);
            req.setHeader('x-ms-version', '2015-12-11');
            req.setHeader('Content-Length', wrapRec.fileLength);
         System.debug('wrapRec.fileLength--->. '+wrapRec.fileLength);
            req.setHeader('Content-Type', wrapRec.fileType);
         System.debug('wrapRec.fileType--->. '+wrapRec.fileType);
            req.setHeader('Authorization', authHeader);

            System.debug('https://'+wrapRec.storageName+'.blob.core.windows.net/'+wrapRec.container+'/'+wrapRec.fileName);
            req.setEndpoint('https://'+wrapRec.storageName+'.blob.core.windows.net/'+wrapRec.container+'/'+wrapRec.fileName);
            req.setBodyAsBlob(fileBody);


            Http http = new Http();

            try
            {
                HTTPResponse res = http.send(req);

                system.debug(res.toString());
                system.debug(res.getStatus());
                system.debug(res.getStatusCode());
                system.debug(res.getBody());
                system.debug('getStatusCode ----.'+res.getStatusCode());
                if(res.getStatusCode() == 201){
                    response = true;
                }

            }
            catch (system.CalloutException ce)
            {
                system.debug('Error Occur----.'+ce);
            }

            return response;

    }

    //returns storage key, storage name and container

    public static AzureService.AzureWrapper storageDetails(){
        //Azure_Details__c detail = Azure_Details__c.getInstance();

        String strStorageKey = 'OCiagdBEZw52wBfFbF9ndVdcdldyaXelnDqglhfAinngPC5+ydmSPlgEMyr6KcyoYhupJ0B0lJBGAI33k4VZFQ==';
        String strStorageName = 'zaindevtesting';
        String strContainer = 'zaindevblob';

        return new AzureService.AzureWrapper(strStorageKey, strStorageName, strContainer);
        //return new AzureService.azureWrapper(detail.StorageKey__c, detail.StorageName__c, detail.Container__c);
    }

    public class AzureWrapper{

        String storageKey;
        String storageName;
        String container;
        String timestamp;
        String fileName;
        String fileType;
        String fileLength;
        String signature;

        public AzureWrapper(String sk, String sn, String cn){
            this.storageKey = sk;
            this.storageName = sn;
            this.container = cn;
        }
    }

}

В конце концов мой заголовок выглядит так:

x-ms-date: ср, 11 марта 2020 г. 00:36:39 GMT x-ms-version: 2015-12-11 Content-Length: 213980 Авторизация : SharedKey zaindevtesting: 6SfwH21pfpr9NiiK8PXXL9IMOs9SWNEvl3Elj2Jfc3w% 3D-тип контента: application / pdf

Тип запроса PUT https://zaindevtesting.blob.core.windows.net/zaindevblob/Consent+form+%281%29.pdf

Я пытался использовать то же почтальон, но получаю Вы можете использовать эту же ссылку для доступа к моему тесту Azure от почтальона и сообщить мне, если требуется какая-то информация.

Я пытаюсь загрузить файл из отдела продаж, но получаю следующую ошибку.

<?xml version="1.0" encoding="utf-8"?>
<Error>
    <Code>InvalidAuthenticationInfo</Code>
    <Message>Authentication information is not given in the correct format. Check the value of Authorization header.
RequestId:6b4f54fd-501e-0013-5f9e-f6c88c000000
Time:2020-03-10T05:43:44.8911977Z</Message>
</Error>

Спасибо, Зейн

...