API significa "Application Programming Interface". Una API proporciona un conjunto de comandos, funciones y protocolos para facilitar la programación de software. Estas funciones predefinidas simplifican la interacción del programador con el sistema operativo, ya que el hardware (monitor, datos en el disco duro, etc.) no tiene que ser direccionado directamente. En lo que se refiere a Internet, las APIs Web están a la vanguardia y también sirven como interfaz para permitir el uso de funciones existentes de terceros.
A continuación y a modo de ejemplo, le adjuntamos una respuesta standard que retorna la API de CuitInfo.com.
Para hacer uso de la API de CuitInfo, lo pueda hacer utilizando la documentación sencilla de este sitio bajo protocolos y procedimientos simples y básicos, o mediante una conexión y autenticación avanzada dentro de APILanding.com.
https://cont.apipagos.com/web/container/api/v1/sysdata/personas
Ante la imparable evolución de aplicaciones, frameworks, lenguajes y alternativas para facilitarnos las tareas de Desarrollo Web en diferentes ámbitos, hablaremos a continuación sobre el modelo de autenticación para API REST de nuestra infraestructura. Las API REST que nuestro cloud entrega son uno de los mejores recursos actuales para cualquier desarrollador y en esta ocasión, queremos que conozcas mejor las características y el flujo de este modelo.
En el mundo de las API REST, se deben implementar flujos distintos de los habituales en cuanto a la autenticación de usuarios, ya que su arquitectura nos ofrece otro tipo de recursos que los tradicionales. Por lo general, en las aplicaciones web tradicionales, se utilizan las variables de sesión como soporte para memorizar el usuario. Esto viene a decir que en el momento de autenticar un usuario, el servidor genera las correspondientes variables de sesión y en las siguientes páginas consultadas por ese mismo cliente, es capaz de recordar al usuario.
Sin embargo, en las aplicaciones REST, esto no es posible, ya que una de las limitaciones de este sistema es que no se dispone de variables de sesión. Esto es debido a motivos de escalabilidad, ya que las API REST suelen estar alojadas en un cluster de servidores. La solución habitual para salvar este problema es la autenticación por token.
Flujo de autenticación por usuario y contraseña El hecho de usar un token como mecanismo involucrado en la autenticación no produce efectos visibles para los usuarios, ya que estos no tienen que lidiar con él directamente. Dicho de otra manera, todas las diferencias en el flujo son transparentes para el usuario.
Nuestro API Cloud Center trabaja de forma standarizada y por defecto con autenticaciòn de toke basado en parametros querys:
Token de Suscripción (token-susc): Este token permite en cada llamado a la api identificar la suscripciòn del usuario.
Token de API (token-api): Este token permite identificar la key de la API que se requiere consumir.
Otros Mecanismos de Seguridad: En caso que el usuario asì lo requiera pueda proteger sus tokens y keys utilizando diferentes mecanismos de seguridad como:
- Authentication by Header
- API EndPoint to Generate Tokens Dynamics.
- oauth2
Mediante el parametro token-susc el sistema debera recibir la key seteada a su suscripciòn y que se encuentra disponible en su Panel Comercial.
Ejemplo: "token-susc":"20190d614196076fb924df8dd392c5as"
Mediante el parametro token-api el sistema debera recibir la key seteada a la API que esta queriendo consumir. Dicha API puede ser solicitada desde su Panel Comercial.
Ejemplo: "token-api":"9f9f0fe087e970b8c21c4577e1cd95af"
curl -X GET "https://cont.apipagos.com/web/container/api/v1/sysdata/personas?type=cuit&doc=30701270637&token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&internalid=YOUR_INTERNAL_ID" -H "accept: application/json"
import requests
r = requests.get('https://cont.apipagos.com/web/container/api/v1/sysdata/personas?type=cuit&doc=30701270637&token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&internalid=YOUR_INTERNAL_ID')
r.json()
require 'net/http'
require 'json'
url = 'https://cont.apipagos.com/web/container/api/v1/sysdata/personas?type=cuit&doc=30701270637&token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&internalid=YOUR_INTERNAL_ID'
uri = URI(url)
response = Net::HTTP.get(uri)
JSON.parse(response)
$json = file_get_contents('https://cont.apipagos.com/web/container/api/v1/sysdata/personas?type=cuit&doc=30701270637&token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&internalid=YOUR_INTERNAL_ID');
echo $json;
$obj = json_decode($json);
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;
import org.json.JSONException;
import org.json.JSONObject;
public class JsonReader {
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
InputStream is = new URL(url).openStream();
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
} finally {
is.close();
}
}
public static void main(String[] args) throws IOException, JSONException {
JSONObject json = readJsonFromUrl("https://cont.apipagos.com/web/container/api/v1/sysdata/personas?type=cuit&doc=30701270637&token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&internalid=YOUR_INTERNAL_ID");
System.out.println(json.toString());
System.out.println(json.get("id"));
}
}
Private Function GetAPIDATA() As String
Dim xmlHttp As Object
Dim strTokenSusc as String
Dim strTokenAPI as String
Dim strUrl as String
strTokenSusc = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
strTokenAPI = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
strUrl = "https://cont.apipagos.com/web/container/api/v1/sysdata/personas?type=cuit&doc=30701270637&token-susc=" & strTokenSusc & "&token-api=" & strTokenAPI & "&internalid=YOUR_INTERNAL_ID"
Set xmlHttp = CreateObject("MSXML2.XmlHttp")
xmlHttp.Open "GET", sURL, False
xmlHttp.send
GetAPIDATA = xmlHttp.responseText
Set xmlHttp = Nothing
End Function
<%
dim url
url = "https://cont.apipagos.com/web/container/api/v1/sysdata/personas?type=cuit&doc=30701270637&token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&internalid=YOUR_INTERNAL_ID"
Set HttpReq = Server.CreateObject("MSXML2.ServerXMLHTTP")
HttpReq.open "GET", url, false
HttpReq.setRequestHeader "Content-Type", "application/json"
HttpReq.Send()
%>
using (var httpClient = new System.Net.Http.HttpClient())
{
var json = await httpClient.GetStringAsync("https://cont.apipagos.com/web/container/api/v1/sysdata/personas?type=cuit&doc=30701270637&token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&internalid=YOUR_INTERNAL_ID");
}
var https = require('https');
var options = {
host: 'https://cont.apipagos.com/web/container/api/v1/',
path: '?token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&internalid=YOUR_INTERNAL_ID',
headers: {
'Accept': 'application/json'
}
};
https.get(options, function (res) {
var json = '';
res.on('data', function (chunk) {
json += chunk;
});
res.on('end', function () {
if (res.statusCode === 200) {
try {
var data = JSON.parse(json);
// data is available here:
console.log(json);
} catch (e) {
console.log('Error parsing JSON!');
}
} else {
console.log('Status:', res.statusCode);
}
});
}).on('error', function (err) {
console.log('Error:', err);
});
package main
import (
"fmt"
"net/http"
"io/ioutil"
"os"
)
func main() {
response, err := http.Get("https://cont.apipagos.com/web/container/api/v1/sysdata/personas?type=cuit&doc=30701270637&token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&internalid=YOUR_INTERNAL_ID")
if err != nil {
fmt.Printf("%s", err)
os.Exit(1)
} else {
defer response.Body.Close()
contents, err := ioutil.ReadAll(response.Body)
if err != nil {
fmt.Printf("%s", err)
os.Exit(1)
}
fmt.Printf("%s\n", string(contents))
}
}
La api puede retornar dos tipos de errores:
- Errores HTTP: Relacionado con la conexión, autenticación o ejecución del proceso: Dichos errores se visualizaran en formato de códigos http diferentes al HTTP Status 200.
- Errores de Resultado: Este tipo de error, esta relacionado con la búsqueda de la persona y dichos errores se visualizaran en la respuesta json bajo las variables "state" y "desc".
Si tiene dudas no dude en consultar a nuestro equipo de soporte para clarificar los errores automatizados del sistema.
200 - OK | OK. |
---|---|
401 - Security | Security tokens not found. |
401 - Security | Security tokens not defined. |
401 - Security | Security tokens error. |
409 - Unauthorized | Suscription stoped. |
409 - Unauthorized | Api offline or discontinued. |
429 - Limits | Limit exceeded. |
state:0 | Type or Doc invalid. |
---|---|
state:100 | Document not found in database. |