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.
https://cont1-virtual1.certisend.com/web/container/api/v1/validations/identity/ar/validate_biometricselfie
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 el directamente. Dicho de otra manera, todas las diferencias en el flujo son transparentes para el usuario.
Nuestro API Cloud Center trabaja de forma estandarizada y por defecto con autenticación de token basado en parámetros 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 asaí 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 parámetro 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": "20190d614196076fb924df8d92c5as"
Mediante el parámetro 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": "9f9f0fe087e970b8c21c45e1cd95af"
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. |
Mediante el metodo de llamado get
la API Identity_Validation_Biometric (Validate DNI with biometric selfies) puede recibir los siguientes parámetros de entrada:
Tipo: string
Requerido: true
Formato: query
Tipo: string
Requerido: true
Formato: body
Tipo: string
Requerido: true
Formato: body
Tipo: string
Requerido: true
Formato: body
curl -X GET "https://cont1-virtual1.certisend.com/web/container/api/v1/validations/identity/ar/validate_biometricselfie?token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&document=VALUE_OF_DOCUMENT&selfie1=VALUE_OF_SELFIE1&selfie2=VALUE_OF_SELFIE2&docfront=VALUE_OF_DOCFRONT&internalid=YOUR_INTERNAL_ID" -H "accept: application/json"
import requests
r = requests.get('https://cont1-virtual1.certisend.com/web/container/api/v1/validations/identity/ar/validate_biometricselfie?token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&document=VALUE_OF_DOCUMENT&selfie1=VALUE_OF_SELFIE1&selfie2=VALUE_OF_SELFIE2&docfront=VALUE_OF_DOCFRONT&internalid=YOUR_INTERNAL_ID')
r.json()
require 'net/http'
require 'json'
url = 'https://cont1-virtual1.certisend.com/web/container/api/v1/validations/identity/ar/validate_biometricselfie?token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&document=VALUE_OF_DOCUMENT&selfie1=VALUE_OF_SELFIE1&selfie2=VALUE_OF_SELFIE2&docfront=VALUE_OF_DOCFRONT&internalid=YOUR_INTERNAL_ID'
uri = URI(url)
response = Net::HTTP.get(uri)
JSON.parse(response)
$json = file_get_contents('https://cont1-virtual1.certisend.com/web/container/api/v1/validations/identity/ar/validate_biometricselfie?token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&document=VALUE_OF_DOCUMENT&selfie1=VALUE_OF_SELFIE1&selfie2=VALUE_OF_SELFIE2&docfront=VALUE_OF_DOCFRONT&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://cont1-virtual1.certisend.com/web/container/api/v1/validations/identity/ar/validate_biometricselfie?token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&document=VALUE_OF_DOCUMENT&selfie1=VALUE_OF_SELFIE1&selfie2=VALUE_OF_SELFIE2&docfront=VALUE_OF_DOCFRONT&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://cont1-virtual1.certisend.com/web/container/api/v1/validations/identity/ar/validate_biometricselfie?token-susc=" & strTokenSusc & "&token-api=" & strTokenAPI & "&document=VALUE_OF_DOCUMENT&selfie1=VALUE_OF_SELFIE1&selfie2=VALUE_OF_SELFIE2&docfront=VALUE_OF_DOCFRONT&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://cont1-virtual1.certisend.com/web/container/api/v1/validations/identity/ar/validate_biometricselfie?token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&document=VALUE_OF_DOCUMENT&selfie1=VALUE_OF_SELFIE1&selfie2=VALUE_OF_SELFIE2&docfront=VALUE_OF_DOCFRONT&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://cont1-virtual1.certisend.com/web/container/api/v1/validations/identity/ar/validate_biometricselfie?token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&document=VALUE_OF_DOCUMENT&selfie1=VALUE_OF_SELFIE1&selfie2=VALUE_OF_SELFIE2&docfront=VALUE_OF_DOCFRONT&internalid=YOUR_INTERNAL_ID");
}
var https = require('https');
var options = {
host: 'https://cont1-virtual1.certisend.com/web/container/api/v1/',
path: 'validations/identity/ar/validate_biometricselfie?token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&document=VALUE_OF_DOCUMENT&selfie1=VALUE_OF_SELFIE1&selfie2=VALUE_OF_SELFIE2&docfront=VALUE_OF_DOCFRONT&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://cont1-virtual1.certisend.com/web/container/api/v1/validations/identity/ar/validate_biometricselfie?token-susc=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&token-api=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&document=VALUE_OF_DOCUMENT&selfie1=VALUE_OF_SELFIE1&selfie2=VALUE_OF_SELFIE2&docfront=VALUE_OF_DOCFRONT&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))
}
}
Una vez consumida la API y siempre y cuando la respuesta de la misma y el contro de autenticación retorne un 200-OK, la misma arrojara los siguientes campos de salida en formato JSON:
Campo | Tipo | Longitud | Descripción | |
|
state | string | Validation results: 0:(wrong DNI number/missing data.), 1:(validated OK). | |
|
desc | string | Description of the query. | |
|
docfront | string | Result of analysis document image front. | |
|
faceid | string | Unique face ID of the detected face. | |
|
faceRectangle | string | Rectangle area destined to the face location. | |
|
top | string | Top area for the location of the face in the image. | |
|
left | string | Left area for the location of the face in the image. | |
|
width | string | Width area for the location of the face in the image. | |
|
height | string | Height area for the location of the face in the image. | |
|
gender | string | Values: male or female. | |
|
age | string | Estimated age based in the uploaded images. | |
|
facialHair | string | Return lengths in three facial hair areas: moustache, beard and sideburns. | |
|
moustache | string | Moustache intensity, returns a number between [0,1]. | |
|
beard | string | Beard intensity, returns a number between [0,1]. | |
|
sideburns | string | Sideburns intensity, returns a number between [0,1]. | |
|
glasses | string | Glasses type. Values include 'No Glasses', 'Reading Glasses', 'Sunglasses', 'Swimming Goggles'. | |
|
emotion | string | Emotion intensity including: neutral, anger, contempt, disgust, fear, happiness, sadness and surprise. | |
|
anger | string | Anger intensity, values between [0,1]. | |
|
contempt | string | Contempt face intensity, varies between [0,1]. | |
|
disgust | string | Disgust intensity, value varies between [0,1]. | |
|
fear | string | Fear intensity, its a number between [0,1]. | |
|
happiness | string | Happiness intensity, a number between [0,1]. | |
|
neutral | string | Neutral intensity, a number between [0,1]. | |
|
sadness | string | Sadness intensity, a number between [0,1]. | |
|
surprise | string | Surprise intensity, a number between [0,1]. | |
|
blur | string | Face is blurry or not. Level returns 'Low', 'Medium' or 'High'. | |
|
blurlevel | string | Level returns 'Low', 'Medium' or 'High'. | |
|
value | string | Value returns a number between [0,1], the larger the blurrier. | |
|
exposure | string | Face exposure level. | |
|
exposureLevel | string | Level returns 'GoodExposure', 'OverExposure' or 'UnderExposure'. | |
|
noise | string | Noise level of face pixels. | |
|
noiseLevel | string | Level returns 'Low', 'Medium' and 'High'. Value returns a number between [0,1] the number larger is the noisier. | |
|
makeup | string | Eye or lip areas have makeup or not. Includes accessories around face as 'headwear' or 'glasses' | |
|
eyeMakeup | string | Eye Makeup --> Returns true-false | |
|
lipMakeup | string | Lip Makeup -- > Returns true-false. | |
|
accessories | string | Accessories around face, including 'headwear', 'glasses' and 'mask'. Empty array means no accessories detected. | |
|
occlusion | string | Visual perception of the image. | |
|
foreheadOccluded | string | Forehead Occluded --> Returns true-false. | |
|
eyeOccluded | string | Eye Occluded --> Returns true-false. | |
|
mouthOccluded | string | Mouth Occluded --> Returns true-false. | |
|
hair | string | Values indicating whether the hair is visible or not. If it's visible returns hair color. | |
|
bald | string | Bald intensity, returns a number between [0,1]. | |
|
invisible | string | Invisible --> Returns true-false. | |
|
hairColor | string | Hair color if hair is visible. | |
|
color | string | Hair color estimation. | |
|
confidence | string | Hair color intensity, a number between [0,1]. | |
|
docback | string | Collection of data that indicates the different features and emotions observed in the photo found on the DNI's back side. Returns the same parameters than docfront. | |
|
selfie1 | string | Result of selfie1 image analysis. | |
|
selfie2 | string | Result of selfie2 image analysis | |
|
verify1 | string | Compare images selfie1 and selfie2 to validate if correspond to the same person. | |
|
verify2 | string | Compare selfie1 and document front images to validate if both are to the same person. | |
|
gender(validate) | string | Values: male or female. | |
|
age(validate) | string | Confirmed age. | |
|
type | string | Document type. | |
|
doc_id | string | Document number. | |
|
digit | string | Digit count introduced on the query. | |
|
id_internal | string | Internal ID. |
200 - OK | Respuesta estandar para peticiones correctas. |
---|---|
400 - Bad Request | El servidor no procesar la solicitud, porque no puede, o no debe, debido a algo que es percibido como un error del cliente (ej: solicitud malformada, sintaxis errónea, etc). La solicitud contiene sintaxis errónea y no debería repetirse. |
401 - Unauthorized | Similar al 403 Forbidden, pero específicamente para su uso cuando la autentificación es posible pero ha fallado o aún no ha sido provista. |
404 - Not Found | Una petición fue hecha a una URI utilizando un metodo de solicitud no soportado por dicha URI; por ejemplo, cuando se utiliza GET en un formulario que requiere que los datos sean presentados vía POST, o utilizando PUT en un recurso de solo lectura. |
409 - Conflict | Indica que la solicitud no pudo ser procesada debido a un conflicto con el estado actual del recurso que esta identifica. |
429 - Too Many Requests | Hay muchas conexiones desde esta dirección de internet. |
500, 502, 503, 504 - Server Errors | El servidor falló al completar una solicitud aparentemente válida. |