in src/zadf/zcl_adf_service_cosmosdb.clas.abap [0:0]
METHOD get_sas_token.
DATA :lv_sign_utf TYPE xstring,
lv_string_to_sign TYPE string,
lv_hash_sig TYPE string,
lv_authstring TYPE string,
lv_key TYPE string,
lv_key_xstr TYPE xstring,
lo_conv TYPE REF TO cl_abap_conv_out_ce.
** generate String To Sign
me->generate_string_to_sign( RECEIVING rv_string_to_sign = lv_string_to_sign ).
** Convert string to UTF-8 format
lo_conv = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ).
lo_conv->convert( EXPORTING data = lv_string_to_sign IMPORTING buffer = lv_sign_utf ).
DEFINE encrypt_signature.
decode_sign( receiving rv_secret = lv_key ).
** Decode Key from base64
call function 'SSFC_BASE64_DECODE'
exporting
b64data = lv_key
importing
bindata = lv_key_xstr
exceptions
ssf_krn_error = 1
ssf_krn_noop = 2
ssf_krn_nomemory = 3
ssf_krn_opinv = 4
ssf_krn_input_data_error = 5
ssf_krn_invalid_par = 6
ssf_krn_invalid_parlen = 7
others = 8.
if sy-subrc <> 0.
raise exception type zcx_adf_service
exporting
textid = zcx_adf_service=>key_decoding_failed
interface_id = gv_interface_id.
endif.
** Encode the signature with the Key in SHA 256 format
call method cl_abap_hmac=>calculate_hmac_for_raw
exporting
if_algorithm = 'SHA-256'
if_key = lv_key_xstr
if_data = lv_sign_utf
if_length = 0
importing
ef_hmacb64string = lv_hash_sig.
clear: lv_key_xstr, lv_key.
END-OF-DEFINITION.
** call macro
encrypt_signature.
IF NOT lv_hash_sig IS INITIAL.
** Construct AuthString
CONCATENATE gc_type gc_separator gc_version gc_separator gc_sig lv_hash_sig INTO lv_authstring.
** Generate AuthToken
rv_sas_token = cl_http_utility=>escape_url( lv_authstring ).
ELSE.
RAISE EXCEPTION TYPE zcx_adf_service
EXPORTING
textid = zcx_adf_service=>auth_token_not_generated
interface_id = gv_interface_id.
ENDIF.