Autenticación de API basada en tokens
Para aumentar la seguridad de las interacciones con Digital Platform API, hemos implementado un sistema de autenticación basado en tokens firmado. Este sistema usa tokens web JSON (JWT) para ayudar a garantizar que las sesiones sean lo más seguras posible. Siga estas instrucciones y debería estar en funcionamiento con JWT en ningún momento.
Nota:
Esta funcionalidad está disponible actualmente para todos los usuarios de Digital Platform API. Aunque la autenticación basada en tokens JWT proporciona seguridad adicional, en este momento se recomienda su uso, pero no es obligatorio. Consulte Servicio de autenticación para obtener más información sobre los procesos de autenticación.
¿Qué es JWT?
Desde el sitio web de JWT:
"JSON Web Token (JWT) es un estándar abierto (RFC 7519) que define una manera compacta y independiente de transmitir información de forma segura entre partes como un objeto JSON".
Xandr proporciona servicios de API REST para que pueda comunicarse con nuestro sistema a través de consultas de línea de comandos y archivos JSON, y devuelve respuestas en forma de JSON. La implementación de un estándar que le permite transmitir esta información de forma segura proporciona una mayor protección de los datos y de todo el sistema de Xandr.
Además, los tokens permiten una mejor administración de los inicios de sesión de usuario. Cuando la contraseña expire, debe cambiar inmediatamente a una nueva contraseña. Con los tokens, puede tener varios tokens a la vez, por lo que cuando un token esté a punto de expirar, tendrá un período de transición que le da tiempo para actualizar la información de inicio de sesión.
Biblioteca JWT
Para usar tokens JWT, tendrá que tener un generador de tokens. Puede generar tokens JWT mediante una de las muchas bibliotecas disponibles en el sitio web de JWT.
Preparación para usar tokens
Para poder usar tokens, deberá iniciar sesión con su contraseña para recopilar información y configurar los tokens en el sistema de Xandr. Una vez registrado el token JWT, no tendrá que volver a iniciar sesión con una contraseña.
Para empezar, autentique y recupere un token de inicio de sesión inicial:
curl -X POST -d '{"auth":{"username":"<username>","password":"<PWD>"}}' https://api.appnexus.com/auth
El nombre de usuario y la contraseña son sus credenciales de inicio de sesión estándar.
Incluido en la respuesta de esta llamada será un token, que tendrá un aspecto similar al siguiente:
"token": "hbapi:123456:9999aa0000dd9:nym2",
Usará este token para acceder al sistema hasta que haya registrado la clave pública (que crearemos en un momento).
A continuación, debe recuperar el identificador de usuario. Recupere el identificador de usuario llamando al servicio de usuario:
curl -H 'Authorization: hbapi:123456:9999aa0000dd9:nym2' 'https://api.appnexus.com/user?username=<username>'
Como usuario que ha iniciado sesión actualmente, también puede usar este comando para buscar el identificador:
curl -H 'Authorization: hbapi:123456:9999aa0000dd9:nym2' 'https://api.appnexus.com/user?current'
Anote el identificador que se devuelve y lo usará más adelante en un archivo JSON para configurar el token.
Create claves privadas y públicas
Nota:
Information
La Administración de red es el rol de plataforma necesario para crear una clave pública para una cuenta determinada.
La clave privada se usa para firmar las solicitudes de autenticación. Una clave privada está pensada para ser exactamente eso: privada. No quiere compartir esta clave con nadie. Ejecute este comando para crear la clave privada:
openssl genrsa -out my-api-key 2048
- openssl: esta es la herramienta de comandos que creará un archivo que contiene la clave privada. Implementa los protocolos Capa de sockets seguros y Seguridad de la capa de transporte.
- genrsa: el comando que indica a openssl que genere una clave privada. Esto usa el sistema criptográfico RSA.
-out my-api-key
: coloque la clave privada en el archivo denominadomy-api-key
.2048
: tamaño, en bits, de la clave privada. Si deja fuera este número, el valor predeterminado es512
. Se recomienda un valor de2048
.
El my-api-key
archivo reemplazará la contraseña como el secreto que protege la cuenta de API.
Use la clave privada para generar una clave pública:
openssl rsa -in my-api-key -pubout > my-api-key.pub
- rsa: el comando que procesa las claves RSA.
-in my-api-key
: archivo que contiene la clave privada que se va a usar como entrada para crear la clave pública.-pubout
: esta opción especifica que se debe generar una clave pública en lugar de una clave privada.- >
my-api-key.pub
: archivo que contiene la clave pública.
La clave pública se compartirá con la API y se usará para comprobar que la clave privada se usó para firmar el JWT.
Reemplazar caracteres de nueva línea
La clave pública contiene saltos de línea. Dado que esta clave se enviará a la API como parte de una carga JSON, debe reemplazar los saltos de línea por caracteres de nueva línea: \n. Puede hacerlo manualmente y, a continuación, copiar la clave en el archivo JSON, o bien puede ejecutar el siguiente comando y copiar la salida:
perl -pe 's/n\n/\\n/g' my-api-key.pub
Nota:
En función del entorno de la línea de comandos, puede mostrar la clave con saltos de línea en lugar del carácter \n. Si esto sucede, deberá escribir manualmente un \n para reemplazar cada salto de línea al copiar la clave en el archivo JSON.
Create el archivo JSON de clave pública
Create un archivo JSON como el siguiente:
{
"public-key": {
"active": true,
"name": "my-api-key",
"user_id": <userid>,
"encoded_value": "<public key>"
}
}
Reemplace por <userid>
el identificador de usuario que recuperamos anteriormente.
Para <public key>
, pegue el valor completo de la clave pública, incluido el BEGIN PUBLIC KEY
texto y END PUBLIC KEY
. No olvide reemplazar todos los saltos de línea por \n. Por ejemplo:
"encoded_value": "-----BEGIN PUBLIC KEY-----\nMIIBI....\n......\n-----END PUBLIC KEY-----"
Guarde el archivo JSON. En este ejemplo, hemos denominado el archivo my-public-key.json
.
Registro de la clave pública
Ejecute el siguiente comando para registrar la clave pública:
curl -H 'Authorization: hbapi:123456:9999aa0000dd9:nym2' -H 'Content-Type: application/json' -X POST -d @my-public-key.json 'https://api.appnexus.com/public-key?user_id=<userid>'
Observe que usamos el mismo token en nuestra llamada al servicio de clave pública que usamos en nuestra llamada anterior al servicio de usuario.
Si la clave se registró correctamente, recibirá una respuesta similar a la siguiente:
{
"response": {
"status": "OK",
"count": 1,
"start": 0,
"num_elements": 1,
"debug_info": {
"instance": "01.authentication-api.test1.nym2",
"time": 475,
"start_time": "2017-02-07T16:48:42.747Z",
"version": "0.22.0",
"request_id": "01.authentication-api.test1.nym2-1486486122747-0000000000000000000"
},
"public-key": {
"active": true,
"encoded_value": "-----BEGIN PUBLIC KEY-----\nMIIBI...\n...\n...\n-----END PUBLIC KEY-----",
"name": "my-api-key",
"user_id": 1234
}
}
}
Create una firma JWT
Ejemplos de pseudocódigo del generador JWT
En los ejemplos siguientes se supone que el usuario ha establecido determinadas variables en información específica de la clave con la que se va a autenticar. Por ejemplo, la an_key_name
variable usada para el kid
encabezado en el código siguiente contiene el valor del "name"
campo usado en el objeto JSON durante el registro de la clave pública con Xandr (consulte Register Your Public Key above). La username
variable utilizada para el valor de sub
encabezado se asignaría al nombre de usuario asociado a la clave, etc.
Ejemplo de Python
# Generates the JWT signature, using the PyJWT library
with open(priv_key_path, 'r') as f:
cert = f.read()
jwt_signature = jwt.encode({
'sub': username,
'iat': datetime.datetime.utcnow()
},
cert,
algorithm='RS256',
headers={
'kid': an_key_name,
'alg': 'RS256',
"typ":"JWT"
}
)
Ejemplo de NodeJS
var jwt = require('jsonwebtoken');
var token = jwt.sign({ sub: username, iat: epoch_time }, cert, { algorithm: 'RS256', header: { kid: an_key_name, alg: 'RS256' }});
Autenticación con un JWT
Ahora es el momento de autenticarse mediante nuestra clave privada y el script de generación JWT. Ejecute un comando similar a este para crear el JWT y autenticarse:
curl -X POST -H 'Content-Type: text/plain' -d $(./<JWT generator>) https://api.appnexus.com/v2/auth/jwt
"Generador JWT" es el script que creó con una biblioteca JWT que genera el token. Hay un ejemplo de pseudocódigo anterior de lo que puede estar en este generador JWT. Puede ejecutar el script por separado y simplemente pasar el token en sí a este comando.
Esto devolverá una respuesta que contenga el nuevo token:
{
"response": {
"status": "OK",
"token": "authn:184994:a1111111-6766-3b66-8544-f11111111ffd:lax1",
"debug_info": {
"instance": "01.authentication-api.test1.lax1",
"time": 624,
"start_time": "2017-02-07T16:49:52.612Z",
"version": "0.22.0",
"request_id": "01.authentication-api.test102975.lax1-1486486192612-3065414328498075565"
}
}
}
Uso del token
Ahora puede usar el token devuelto por la llamada JWT para autenticar todas las llamadas a la API. Por ejemplo, esta es la misma llamada al servicio de API de usuario mediante nuestro nuevo token:
curl -H 'Authorization: authn:184994:a1111111-6766-3b66-8546-f11111111ffd:lax1' 'https://api.appnexus.com/user?current'
Nueva sesión
Una vez que haya expirado la sesión, tendrá que volver a autenticarse. Pero a partir de este momento puede omitir todos los pasos de la sección anterior hasta Create un token JWT. Esto significa que para cada sesión, deberá crear un nuevo token JWT y usar ese token para autenticar el resto de las llamadas API. No tendrá que volver a usar la contraseña.
Desactivación de la clave pública
Puede quitar el acceso a la public-key
API desactivando . Para desactivar una clave, cree un archivo JSON como este:
{
"public-key": {
"active": false
}
}
Como puede ver, este archivo simplemente establece el active
campo false
en , lo que indica que public-key
ya active
no es . Ejecute el siguiente comando para desactivar :public-key
curl -X PUT -H 'Authorization: authn:184994:a1111111-6766-3b66-8546-f11111111ffd:lax1' -H 'Content-Type: application/json' -d @pkdeactivate.json 'https://api.appnexus.com/public-key?key_id=2&user_id=1234'
En el comando, debe incluir el json con el active
campo establecido false
en (en este caso, hemos incluido ese JSON en el archivo pkdeactivate.json
). También debe incluir y key_id
user_id
en la cadena de consulta (public-key?key_id=2&user_id=1234
).
Puede encontrar para key_ids
un usuario con un comando simple GET
:
curl -H 'Authorization: authn:184994:a1111111-6766-3b66-8546-f11111111ffd:lax1' 'https://api.appnexus.com/public-key?user_id=1234'
Puede reactivar fácilmente la clave con el mismo comando que usamos para desactivarla. Simplemente cambie el archivo JSON para establecerlo active
en true
.