== ¿Cómo usar el API de Murachi? == === Detalles de seguridad === [[Image(security.jpg,120px)]] Todos los recursos del API requieren autenticación básica HTTP (''Basic Authentication''). Por esta razón, en todas las solicitudes debe estar presente el encabezado ''Authorization'' lleno con los valores {{{app_id}}} y {{{app_key}}} que se generará para su consumo. Por ejemplo si las credenciales de su aplicación son las siguientes: * {{{app_id: murachi.test}}} * {{{app_key: 12345678}}} necesitará codificarlas con el algoritmo Base64: {{{Base64(app_id:app_key)}}}. El resultado debería ser como el siguiente encabezado HTTP: ''Authorization: Basic aG9sYTptdW5kbw==''. Puede convertir credenciales a Base64 con la siguiente línea de comando: {{{ echo -n APP_ID:APP_KEY | base64 }}} reemplazando APP_ID y APP_KEY con sus respectivas credenciales. '''NOTA:''' inicialmente para propósitos de prueba se estarán utilizando las credenciales * {{{app_id: admin}}} * {{{app_key: admin}}} Esto da como resultado: {{{YWRtaW46YWRtaW4=}}}. '''Entonces mientras se habilita el proceso de generación de API_KEY para clientes del API se utilizará lo siguiente:''' {{{ Authorization: Basic YWRtaW46YWRtaW4= }}} ''' al momento de consumir un recurso de Murachi. ''' === Documentación del API === [[Image(documentacion.png,link=https://murachi.cenditel.gob.ve/apidoc/,120px)]] Para consumir o hacer llamadas a los recursos del servicio Murachi puede revisar el siguiente enlace: [https://murachi.cenditel.gob.ve/apidoc/]. Allí encontrará todos los recursos disponibles hasta el momento con sus parámetros, respuestas, errores y ejemplos de uso. === Prueba básica con Ruby === [[Image(ruby.jpg,120px)]] En el siguiente código se cargan dos (02) archivos de texto y se agregan a un contenedor BDOC a través del recurso {{{https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/bdocs/cargas}}}. Luego se listan los archivos que tiene el contenedor con el recurso {{{https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/bdocs/archivos/lista/%s}}}. Seguidamente se prepara la firma del contenedor BDOC a través del recurso {{{https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/bdocs/firmas/pre}}} que retorna el hash que se debe firmar en el cliente con la clave privada protegida en el dispositivo criptográfico. Luego se completa la firma del contenedor BDOC a través del recurso {{{https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/bdocs/firmas/post}}}. Finalmente se verifica la firma del contenedor BDOC a través del recurso {{{https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/56143d89-1029-4ae4-b023-ca4367a8f34d}}} Para mayor información y documentación de los recursos disponibles siga el enlace: [https://murachi.cenditel.gob.ve/apidoc/]. * Crear el archivo {{{multipart.rb}}} con el siguiente contenido: {{{ require 'net/https' require 'net/http/post/multipart' require "openssl" require "json" # Cargas archivo y crear contenedor BDOC #uri = URI.parse('https://192.168.12.125:8443/Murachi/0.1/archivos/bdocs/cargas') @uri = URI.parse('https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/bdocs/cargas') @req = Net::HTTP::Post::Multipart.new @uri.path, "f1" => UploadIO.new(StringIO.new("cadena de prueba"), "text/plain", "file.txt"), "f2" => UploadIO.new(StringIO.new("SEGUNDA cadena de prueba"), "text/plain", "file2.txt") # Agregar cabezera para autenticación con murachí @req['Authorization'] = 'Basic YWRtaW46YWRtaW4=' @http = Net::HTTP.new(@uri.host, @uri.port) @http.use_ssl = true @http.verify_mode = OpenSSL::SSL::VERIFY_NONE # RESPUESTA --->> @res = @http.request(@req) # Body @json_resp = JSON.parse(@res.body) puts @json_resp['containerId'] # Listar archivos del contenedor registrado en la llamada anterior @container_id = @json_resp['containerId'] @uri = URI.parse 'https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/bdocs/archivos/lista/%s' % @container_id @req = Net::HTTP::Get.new @uri.path @req['Authorization'] = 'Basic YWRtaW46YWRtaW4=' @res = @http.request(@req) @json_resp = JSON.parse(@res.body) @json_resp['dataFiles'].each do |file| puts file['filename'] end # Prepara firma de un contenedor @certificate = "30820512308202FAA003020102020119300D06092A864886F70D01010B05003081AA310B3009060355040613025645310F300D060355040813064D6572696461310F300D060355040713064D65726964613111300F060355040A130843454E444954454C310E300C060355040B13054749445349312E302C06035504030C254175746F7269646164206465204365727469666963616369C3B36E2064656C2047494453493126302406092A864886F70D0109011617616367696473694063656E646974656C2E676F622E7665301E170D3135303930383135333930305A170D3136303930383135333930305A308198310B3009060355040613025645310F300D060355040813064D6572696461310F300D060355040713064D65726964613111300F060355040A130843454E444954454C31133011060355040B130A4465736172726F6C6C6F311630140603550403130D4A6F726765205265646F6E646F3127302506092A864886F70D01090116186A7265646F6E646F4063656E646974656C2E676F622E766530820122300D06092A864886F70D01010105000382010F003082010A0282010100E27AC29BDC3196EFD1F388B6B415F965E7407616448A2A3AF40C7D3E2BFCEA7531A922578B444ACA4386A1744DDCD9507221CCCE9D3A9B81D46FFE274BA378D8413DED29CF596C5F5D7967C9D2E8F1EC1ACDD90582FD8DE055401D9906678DDB4A2F9E4E0FF8041740EAB6A4DFEF308AC1D05824FE4C5CCAA9435F8CAA3C73F937E1BA6F3075CCD2B5D8069BD937B8D9FFD34CB3F8E6B4CFA13BE62110DD677FC4653043ECE4D4E4D9373E01165E6BD33D2B8D1A477AA18E8F1CF68C6476BB30B187BAF2DDC0B8C06DF8292E4C4D57933A44E0B5AA17CC09FE85D4EB9A3F8082F603326FCA407C51691886ED47C15637AE75339F23E8F549F7DCB54CBC6555390203010001A3533051300C0603551D130101FF04023000300E0603551D0F0101FF0404030204F0301106096086480186F84201010404030205A0301E06096086480186F842010D0411160F786361206365727469666963617465300D06092A864886F70D01010B05000382020100556A0C471B30503343A375F54C0DCD345B3BB895A059E734315375B919AEB404C22E897A50D4B983B9480B4BBB48861C8BF27634E185460C95DE010D0DBB0B3091C439AB99ED862134FAD0610F5D7304F0365781FD35FD6340ACBD8EB05866CB44DB02590A06EAAF3978B6EA224F6B226B528DE841273146AFA873A56EE82B149817545074F40B97A26093A76DE174EEBC12285023FAA57A3E24ACC7D3BB0360FFF6D71AB3E3F30EBC07A14F73B974F4623421F762F155E7487F1C44E89F477BAB4A9843FC07DB5AF90943C298DFF5E9B3FDF3358AD145C5138F312170D767F0FEFD2DE7B3BDCD2F54E999A9E10E7B3C7AAF8AACDF65DE9D6FCDBC0E190048623AA494BBB6BA3A0FC0D2E1279D61D36D3B107C48236FA771CD6ED204C97D7AD6369E442DAF8A6E78D7104D4D1C19B0040039CCD20B3A0049236F726AC145AFD37FD54EA0FA44C1CD3131B858DE0D9A904B833DB33F66D75AA7396215561BEB9A0830B4282A08A57944C516F9406A01906D26E6A542861C057ADB34D66BDA2E92A5B62B30DAAD9F27F35348FD3481F18023C2687F8A288BB10B1FBBF5351140DA3BF67AFDFDE805618A355A3BE162C3F93C3F87370B815583EF31CBC68BF1F9CF1B04D6DAA685FD46FF4C5D507BF2C370B9120F07A33F2F9FABA4102A004D8F1CD6136FD63F15E3C26AC73B9ED8BDA930B21DD85F4CF9F778C12DA4B0E459B5BA" @parameters = {"fileId" => @container_id, "certificate" => @certificate, "city" => "Rubio", "state" => "Tachira", "postalCode" => "1234", "country" => "Venezuela", "role" => "Militar", "addSignature" => "false"} @headers = { "Content-Type" => 'application/json', "Authorization" => 'Basic YWRtaW46YWRtaW4='} #@uri = URI.parse("https://192.168.12.125:8443/Murachi/0.1/archivos/bdocs/firmas/pre") @uri = URI.parse("https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/bdocs/firmas/pre") @http = Net::HTTP.new(@uri.host, @uri.port) @http.use_ssl = true @http.verify_mode = OpenSSL::SSL::VERIFY_NONE @res = @http.post(@uri.path,@parameters.to_json,@headers) @hash = JSON.parse(@res.body)["hash"] puts @hash # Completar firma de contenedor @parameters = {"containerId" => @container_id, "signature" => @hash} @headers = { "Content-Type" => 'application/json', "Authorization" => 'Basic YWRtaW46YWRtaW4='} #@uri = URI.parse("https://192.168.12.125:8443/Murachi/0.1/archivos/bdocs/firmas/pre") @uri = URI.parse("https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/bdocs/firmas/post") @http = Net::HTTP.new(@uri.host, @uri.port) @http.use_ssl = true @http.verify_mode = OpenSSL::SSL::VERIFY_NONE @res = @http.post(@uri.path,@parameters.to_json,@headers) puts @res.body # verificacion # Listar archivos del contenedor registrado en la llamada anterior @container_id = '56143d89-1029-4ae4-b023-ca4367a8f34d' @uri = URI.parse 'https://murachi.cenditel.gob.ve/Murachi/0.1/archivos/%s' % @container_id @req = Net::HTTP::Get.new @uri.path @req['Authorization'] = 'Basic YWRtaW46YWRtaW4=' @res = @http.request(@req) @json_resp = @res.body puts @json_resp }}} * Ejecutar: {{{ruby multipart.rb}}}