Autenticación
La API se autentica mediante un token de API que los clientes pueden obtener de la siguiente manera:
- Iniciar sesión en Mi Cuenta.
- Hacer clic en la pestaña Mi Información en la pantalla de bienvenida.
- Hacer clic en el enlace Mi perfil de cuenta link.
- Encontrar el token de API en la parte superior del perfil.
Agregar Encabezados Necesarios
Es necesario incluir los siguientes dos encabezados en cada solicitud:
- User-Agent
El valor del encabezado User-Agent no importa y puede proporcionar cualquier valor que desee. Es obligatorio porque las listas de verificación de ciberseguridad, contra las cuales se audita el sistema de Skypunch, requieren que se incluya un encabezado User-Agent en cada solicitud REST. - Content-Type
El valor del encabezado Content-Type debe ser uno de los siguientes:- application/json
- application/x-www-form-urlencoded
Los encabezados Content-Type normalmente se usan para indicar a un endpoint RESTful el formato de los datos devueltos en la respuesta. Ese no es el caso con los endpoints de Skypunch. Por lo tanto, el valor real especificado para Content-Type no es realmente importante, siempre y cuando sea uno de los valores permitidos listados arriba. Sin embargo, dado que los marcos de ciberseguridad requieren que se envíe un valor de encabezado Content-Type aceptable para cada endpoint REST, debe incluirse obligatoriamente.
Consejos para Desarrolladores
Las herramientas de documentación populares (como Swagger) no son adecuadas para la API de Skypunch Technology porque, a diferencia de muchas APIs, estos servicios—o al menos los tres servicios de papeleta—no están diseñados principalmente para permitir operaciones CRUD (Crear, Leer, Actualizar y Eliminar) sobre datos. Más bien, el recurso de la API para la papeleta y sus tres sub-recursos (step_one, step_two, step_three) soportan la lógica real de la aplicación y el flujo del usuario a través del proceso de:
- Ver una papeleta.
- Confirmar las selecciones realizadas por un votante en esa papeleta.
- Insertar la papeleta en el sistema.
Por esta razón, las representaciones de la papeleta en step_one y step_two devuelven HTML como respuesta. Este HTML está listo para ser mostrado en un navegador web y puede ser estilizado para integrarse con el aspecto y la sensación del sitio que lo consuma, como se explica en la sección Estilizando la Papeleta.
Estilizando la Papeleta
Al consumir una papeleta en tu propio sitio web utilizando los métodos Get Ballot step one y Get Ballot step two detallados a continuación, por defecto no tendrá ningún estilo aplicado y, por lo tanto, no se verá muy bien. Para cambiar eso y aplicar los mismos estilos utilizados cuando la papeleta está alojada en el sitio de Skypunch Technology, sigue estos pasos:
- Inicia sesión en Mi cuenta.
- Haz clic en el botón Vista previa de la papeleta asociado con tu elección. (Si ese botón no se muestra, también puedes hacer clic en el enlace Enviar una papeleta en papel.)
- Una vez que la papeleta se muestre, ve al código fuente de esa página.
- Copia la hoja de estilo de la sección HEAD en esta página y pégala en cada una de tus páginas de papeleta.
Al copiar la hoja de estilo de una papeleta actual en el sitio de Skypunch Technology, te aseguras de tener los estilos más actualizados en uso con la papeleta en cualquier momento. Una vez que la hoja de estilo se haya copiado en tus propias páginas de papeleta, puedes dejarla tal como está o realizar cualquier cambio que desees en esos estilos para hacer que la papeleta se integre perfectamente con el aspecto y la sensación de tu propio sitio.
Evitando Conflictos de Estilos
Algunos de los estilos pueden entrar en conflicto con los estilos existentes que ya se usan en tu sitio. Sin embargo, dado que la salida de los métodos step_one y step_two debe estar anidada en una etiqueta, se recomienda incluir el atributo id para esa etiqueta FORM con un valor como "ballot". Un ejemplo sería:
<form method="post" id="ballot">
Luego, antepones cualquier regla CSS donde haya un conflicto con #ballot. Un ejemplo sería:
#ballot header > div > img:first-child {width:570px; height:95px; vertical-align:text-bottom;}
Esto convierte el selector para esa regla en un selector descendiente, y asegura que la regla solo se aplique a la papeleta y a nada más.
Los Métodos de la API
- Los valores entre llaves son variables proporcionadas por la aplicación que consume la API.
- El ID de la elección es el ID de tu elección generado por Skypunch Technology para cada elección. Este valor se muestra en tu cuenta de Skypunch Technology asociada con cada elección, o puedes obtenerlo programáticamente desde el punto final /elections.
- La documentación hace referencia a los tres modelos para llevar a cabo una elección: 1. completamente alojado, 2. autenticación pasada y 3. completamente integrado. Esos modelos están representados en los Diagramas de Flujo de Modelos de Elección.
Obtener información de las elecciones
Método HTTP: GET
GET /rest/v3/elections
Host: www.electionsonline.com
key: 08BF6D9D-YC16-72F4-385AD9AF30CCF877
[
{
"ID": 1549,
"UUID": "xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx",
"PUBLISHRESULTS": 1,
"ELECTIONNAME": "Sample Election",
"STARTDATE": "June, 06 2016 00:00:00",
"ENDDATE": "June, 13 2016 23:59:00",
"BIODEADLINE": "June, 03 2016 23:59:00"
},
{
"ID": 1562,
"UUID": "xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx",
"PUBLISHRESULTS": 0,
"ELECTIONNAME": "Demonstration Election",
"STARTDATE": "June, 29 2016 00:00:00",
"ENDDATE": "June, 29 2016 00:00:00",
"BIODEADLINE": "June, 29 2016 00:00:00"
}
]
Obtener elección específica
Método HTTP: GET
GET /rest/v3/elections/{electionID}
Host: www.electionsonline.com
key: 08BF6D9D-YC16-72F4-385AD9AF30CCF877
[
{
"ID": 1549,
"UUID": "xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx",
"PUBLISHRESULTS": 1,
"ELECTIONNAME": "Sample Election",
"STARTDATE": "June, 06 2016 00:00:00",
"ENDDATE": "June, 13 2016 23:59:00",
"BIODEADLINE": "June, 03 2016 23:59:00"
}
]
Obtener papeleta – paso uno
Método HTTP: POST
- VoterID es un identificador numérico único para cada votante.
- Voted es un valor booleano que indica el estado de votación de los votantes. False para quienes no han votado, true para quienes sí lo han hecho.
- VoterGroup debe ser una cadena vacía cuando no se asocian grupos de votantes con una elección. Sin embargo, cuando se utiliza, este parámetro debe coincidir con el código de grupo de votantes correspondiente definido en la configuración de la elección para los votantes que pertenecen a un grupo específico.
- SIGs, al igual que VoterGroup, debe ser una cadena vacía cuando no se usa. Cuando se utiliza, este parámetro debe coincidir con el código SIG asociado a cualquier cargo que deba incluirse en la papeleta para ese votante.
- Weight debe tener por defecto el valor 1, pero puede ser cualquier valor entero para reflejar el peso de la papeleta de un votante en casos donde algunas papeletas tienen más peso que otras.
- js es un parámetro booleano. True para navegadores que soportan JavaScript, false para aquellos que no. Esto afecta el comportamiento de las biografías de los candidatos.
POST /rest/v3/elections/{electionID}/ballot/step_one
Host: www.electionsonline.com
key: 08BF6D9D-YC16-72F4-385AD9AF30CCF877
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
voterID=10&voted=false&voterGroup=&sigs=&weight=1&js=true
Obtener papeleta – paso dos
Método HTTP: POST
- Papeleta se distingue en que es un fragmento de XML que se crea a partir de las selecciones realizadas por el votante en la página anterior. El siguiente ejemplo demuestra el formato de XML que debe generarse. Para fines de demostración, este ejemplo asume:
- La papeleta contiene los cargos Presidente (id = 8812) y Tesorero (id = 8813).
- El votante seleccionó a Robert Harrison para Presidente y a Terry McAllister para Tesorero.
- El votante no proporcionó comentarios, o los comentarios no están habilitados para ninguno de los cargos.
‹positions› ‹position› ‹positionID›pos8812‹/positionID› ‹candidates›Robert Harrison‹/candidates› ‹comments›‹/comments› ‹/position› ‹position› ‹positionID›pos8813‹/positionID› ‹candidates›Terry McAllister‹/candidates› ‹comments›‹/comments› ‹/position› ‹/positions› - VoterID es un identificador numérico único para cada votante.
- Weight debe tener por defecto el valor 1, pero puede ser cualquier valor entero para reflejar el peso de la papeleta de un votante en casos donde algunas papeletas tienen más peso que otras.
- Languages es una cadena de texto delimitada por comas con los códigos de idiomas soportados por el sistema (en para inglés, es para español, de para alemán, fr para francés, it para italiano, ch para chino, br para portugués).
POST /rest/v3/elections/{electionID}/ballot/step_two
Host: www.electionsonline.com
key: 08BF6D9D-YC16-72F4-385AD9AF30CCF877
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
ballot=‹positions›‹position›‹positionID›pos8812‹/positionID›‹candidates›Robert Harrison‹/candidates›‹comments›‹/comments›‹/position›
‹position›‹positionID›pos8813‹/positionID›‹candidates›Terry McAllister
‹/candidates›‹comments›‹/comments›‹/position›‹/positions›&voterID=123&weight=1&languages=en
Obtener papeleta – paso tres
Método HTTP: POST
- Papeleta
‹positions› ‹position› ‹positionID›pos8812‹/positionID› ‹candidates›Robert Harrison‹/candidates› ‹comments›‹/comments› ‹/position› ‹position› ‹positionID›pos8813‹/positionID› ‹candidates›Terry McAllister‹/candidates› ‹comments›‹/comments› ‹/position› ‹/positions› - VoterID es un identificador numérico único para cada votante.
- Weight debe tener por defecto el valor 1, pero puede ser cualquier valor entero para reflejar el peso de la papeleta de un votante en casos donde algunas papeletas tienen más peso que otras.
- VoterGroup es la misma variable utilizada en la representación de la papeleta de paso uno.
- SIGs es la misma variable utilizada en la representación de la papeleta de paso uno.
- custom1 es un parámetro opcional usado para enviar datos demográficos específicos del votante.
- custom2 es un parámetro opcional usado para enviar datos demográficos específicos del votante.
- custom3 es un parámetro opcional usado para enviar datos demográficos específicos del votante.
- custom4 es un parámetro opcional usado para enviar datos demográficos específicos del votante.
- Languages es una cadena de texto delimitada por comas con los códigos de idiomas soportados por el sistema (en para inglés, es para español, de para alemán, fr para francés, it para italiano, ch para chino, br para portugués).
POST /rest/v3/elections/{electionID}/ballot/step_three
Host: www.electionsonline.com
key: 08BF6D9D-YC16-72F4-385AD9AF30CCF877
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
ballot=‹positions›‹position›‹positionID›pos8812‹/positionID›‹candidates›Robert Harrison‹/candidates›‹comments›‹/comments›‹/position›‹position›‹positionID›pos8813‹/positionID›‹candidates›Terry McAllister‹/candidates›‹comments›‹/comments›‹ /position›‹/positions›&voterID=123&weight=1&voterGroup=&sigs=&custom1=&custom2=&custom3=&custom4=&languages=en
{
"heading": "PHNwYW4gY2xhc3M9Imxhbmd1YWdlXzEiPkJhbGxvdCBhY2NlcHRlZDwvc3Bhbj4=",
"message": "PHNwYW4gY2xhc3M9Imxhbmd1YWdlXzEiPlRoYW5rIHlvdS4gWW91ciBiYWxsb3Q
gaGFzIGJlZW4gYWNjZXB0ZWQuPC9zcGFuPg==",
"status": "1",
"ballot_id": "DSSYjuoBdDkJi2fjq3C1WL",
"verify_heading": "PHNwYW4gY2xhc3M9Imxhbmd1YWdlXzEiPkJhbGxvdCB2ZXJpZmljYXRpb
248L3NwYW4+",
"verify_message": "PHNwYW4gY2xhc3M9Imxhbmd1YWdlXzEiPihPcHRpb25hbCkgVmVyaWZ5a
W5nIHRoaXMgYmFsbG90IGxhdGVyIHJlcXVpcmVzIHNhdmluZyBkYXRhIGFib3V0IGl0IHJpZ
2h0IG5vdy48L3NwYW4+",
"verify_button": "PHNwYW4gY2xhc3M9Imxhbmd1YWdlXzEiPkdldCB2ZXJpZmljYXRpb24g
ZGF0YTwvc3Bhbj4="
}
Obtener recuento de papeletas
Método HTTP: GET
GET /rest/v3/elections/2206/ballot/count
Host: www.electionsonline.com
key: 08BF6D9D-YC16-72F4-385AD9AF30CCF877
Cache-Control: no-cache
Obtener votantes
Método HTTP: GET
GET /rest/v3/elections/{electionID}/voters
Host: www.electionsonline.com
key: 08BF6D9D-YC16-72F4-385AD9AF30CCF877
Cache-Control: no-cache
[
{
"ID": 2891481,
"FIRSTNAME": "Pete",
"LASTNAME": "Lopez",
"EMAIL": "lopez@phony-domain.net",
"WEIGHT": 1.0000,
"VOTERGROUP": null,
"SIGS": null,
"ROLES": "voter",
"VOTED": 1,
"CUSTOM1": null,
"CUSTOM2": null,
"CUSTOM3": null,
"CUSTOM4": null,
"LANGUAGE": null,
"OTP_TYPE": "s",
"STATIC_OTP": 109379
},
{
"ID": 2891486,
"FIRSTNAME": "Jimmy",
"LASTNAME": "Roberts",
"EMAIL": "jimmy@phony-domain.tech",
"WEIGHT": 1.0000,
"VOTERGROUP": null,
"SIGS": null,
"ROLES": "voter",
"VOTED": 0,
"CUSTOM1": null,
"CUSTOM2": null,
"CUSTOM3": null,
"CUSTOM4": null,
"LANGUAGE": null,
"OTP_TYPE": null,
"STATIC_OTP": null
}
]
Agregar un votante
Método HTTP: POST
POST /rest/v3/elections/{electionID}/voters
Host: www.electionsonline.com
key: 08BF6D9D-YC16-72F4-385AD9AF30CCF877
Content-Type: application/json
Cache-Control: no-cache
{
"first_name":"Terry",
"last_name":"McMurray",
"email":"terry@phony-domain.net",
"weight":1,
"voter_group":"student",
"sigs":"",
"custom1":"",
"custom2":"",
"custom3":"",
"custom4":"",
"otp_type":""
}{
"sigs": null,
"email": "terry@phony-domain.net",
"voted": 0,
"weight": 1.0000,
"custom1": null,
"custom2": null,
"custom3": null,
"custom4": null,
"language": null,
"otp_type": null,
"voter_id": 2891501,
"last_name": "McMurray",
"first_name": "Terry",
"voter_group": "student"
}
Obtener los IDs de los votantes con autenticación aprobada
Método HTTP: GET
GET /rest/v3/elections/{electionID}/voters/passed
Host: www.electionsonline.com
key: 08BF6D9D-YC16-72F4-385AD9AF30CCF877
Cache-Control: no-cache
6103,4982,1085,10876,2374,1984
Obtener token para autenticación aprobada
Método HTTP: POST
La respuesta es un objeto JSON (ver Respuesta de ejemplo más abajo) que contiene tres claves. Los valores asociados a esas claves dependen de la respuesta de este endpoint. Cuando este endpoint emite un token, la clave token_issued tendrá el valor yes y la clave token contendrá el token que puede usar para autenticar al votante y dirigirlo a la papeleta. Haga esto redirigiendo la solicitud a la siguiente URL proporcionando el token de la respuesta como valor del parámetro token. Por ejemplo: https://www.electionsonline.com/vote/login.cfm?token=xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx. En otros casos, por ejemplo si el votante ya ha votado, aparecerá un mensaje al respecto en la clave message y token estará vacío.
En la solicitud de ejemplo que se muestra a continuación, los cuatro campos custom al final de la cadena de pares nombre/valor son todos opcionales. Inclúyalos si desea enviar datos demográficos personalizados del votante al sistema. De lo contrario, pueden omitirse.
POST /rest/v3/elections/{electionID}/token
Host: www.electionsonline.com
key: 08BF6D9D-YC16-72F4-385AD9AF30CCF877
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
firstname=Robert&lastname=Royal&email=royal@phony-domain.tech&voterID=1268&weight=1&votergroup=0&sigs=0&custom1=51&custom2=22213&custom3=Male&custom4=Volunteer
{
"Token": "f3de9ee1-c143-11ee-8cac-74867a213c83",
"Message": "",
"token_issued": "yes"
}