Saltar a contenido

B2C Admin & Validation API's

Admin & Validation son API's utilizadas en el proceso de autenticación cuando se usa Azure B2C.

  • Validation: Utilizada dentro de los flujos de Azure B2C para obtener información extra de usuario para una aplicación en particular.
  • Admin: Utilizada para realizar la administración de la información almacenada de los usuarios por aplicación, la información por usuario es almacenada en 2 colecciones de MongoDB.

API de autenticación:

Está integrada en el flujo de login de Azure B2C. Al realizar la autenticación Azure B2C realiza un post al endpoint /authenticate enviando un body con el usuario y el application id.

{
    "username": "usuario@dominio.com",
    "appId":"a69523f3-c37a-46ec-814f-f9ebc46ad76"
}
Si el request no encuentra un usuario asignado a esa aplicación devolverá un json vacío
{}
y en el log de la app registrara el siguiente mensaje:

No se encontró el Usuario usuario@dominio.com en la App a69523f3-c37a-46ec-814f-f9ebc46ad76

En caso de encontrar un match devolverá un objeto raw con las propiedades definidas en el documento de MongoDB.

{
    "raw": {
        "loyaltyID": "87941",
        "promoCode": "RCT876",
        "nuevaPropiedad": 159
    }
}
La API de autenticación es publica y por lo tanto solo consulta los datos, no modifica ni agrega datos a los documentos. En caso de recibir una petición con datos faltantes o mal formada la respuesta será un 409 Conflict

Cuando la autenticación la realiza B2C la API de validación insertara en el token de respuesta el valor raw

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "n2seygU0a7RBGdOp9HQJwqjaK7OUKnqgtadIF6QbWWE"
}.{
  "exp": 1612890235,
  "nbf": 1612883035,
  "ver": "1.0",
  "iss": "https://andreanib2cdev.b2clogin.com/226a3c28-81b4-4606-9a63-040f553bb647/v2.0/",
  "sub": "d3ab8d27-c9e3-49ba-9c3d-5d4d63dc2fbd",
  "aud": "27ed4d41-a049-46a8-b9e7-873f80786ac7",
  "nonce": "defaultNonce",
  "iat": 1612883035,
  "auth_time": 1612883035,
  "signInNames.emailAddress": "l@prisma.cc",
  "name": "Leandro Amore",
  "given_name": "Leandro",
  "family_name": "Amore",
  "raw": "{\r\n  \"promCode\": \"7887788\"\r\n}",
  "tid": "226a3c28-81b4-4606-9a63-040f553bb647"
}.[Signature]
En caso de que el usuario no esté registrado para la aplicación el token no incluirá el raw vacío
{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "n2seygU0a7RBGdOp9HQJwqjaK7OUKnqgtadIF6QbWWE"
}.{
  "exp": 1612888906,
  "nbf": 1612881706,
  "ver": "1.0",
  "iss": "https://andreanib2cdev.b2clogin.com/226a3c28-81b4-4606-9a63-040f553bb647/v2.0/",
  "sub": "d3ab8d27-c9e3-49ba-9c3d-5d4d63dc2fbd",
  "aud": "27ed4d41-a049-46a8-b9e7-873f80786ac7",
  "nonce": "defaultNonce",
  "iat": 1612881706,
  "auth_time": 1612881706,
  "signInNames.emailAddress": "l@prisma.cc",
  "name": "Leandro Amore",
  "given_name": "Leandro",
  "family_name": "Amore",
  "tid": "226a3c28-81b4-4606-9a63-040f553bb647"
}.[Signature]

API de administración

La API de administración sólo es accesible internamente y permite gestionar y consultar los documentos de MongoDB, para consultar los endpoints se debe utilizar un header de autenticación X-API-Key Los endpoints disponibles son:

ListApps

Método: GET

Endpoint: /users/{username@dominio.com}/apps

Código de respuesta: 200

El endpoint devolverá un json con todas las aplicaciones en donde el usuario se encuentra registrado, en el usuario inició sesión usando el método /authenticate la respuesta incluirá el último login.

[
    {
        "appId": "a69523f3-c37a-46ec-814f-f9ebc46ad761",
        "lastLogon": 1612875324081
    },
    {
        "appId": "2feb4a4e-92e9-4101-8e57-5036f3897707"
    }
]
Si el usuario no existe en ningún documento la respuesta será un arreglo vacío
[]

Paginación

Puedes utilizar la paginación para obtener resultados parciales de las aplicaciones del usuario. Para ello, debe incluir los siguientes headers en tu solicitud:

  • X-page: Especifica el número de página que deseas obtener.
  • X-size: Especifica el tamaño de la página, es decir, la cantidad de aplicaciones que deseas obtener por página.

Ten en cuenta que si no se proporcionan los headers de paginación, se devolverán todos los resultados en una única respuesta. Si hay más resultados disponibles, la respuesta incluirá información adicional para realizar la paginación.

GetClaims

Método: GET

Endpoint: /users/{username@dominio.com}/apps/{AppId}

Código de respuesta: 200

El endpoint devolverá un json con las propiedades definidas en el documento de MongoDB

{
    "loyaltyID": "87941",
    "promoCode": "RCT876",
    "nuevaPropiedad": 159
}
Si la consulta no encuentra datos devolverá un json con el error
{
    "type": "about:blank",
    "title": "No se encontró el mapping",
    "status": 404
}
y registrará el mensaje de error en la consola

No se encontró el Usuario usuario@dominio.com en la App a69523f3-c37a-46ec-814f-f9ebc46ad76

UpdateInfo

Método: POST

Endpoint: /users/{username@dominio.com}/apps/{AppId}

Código de respuesta: 201

BODY:

{
    "loyaltyID": "87941",
    "promoCode": "RCT876",
    "nuevaPropiedad" : 159
}

Si el update se realiza sobre un documento existente la respuesta será un código http 200, en caso de que el request genere un documento nuevo la respuesta será un código 201. Si el request contiene un body con errores el código http será un 400 con el siguiente body

{
    "type": "about:blank",
    "title": "En body debe ser un JSON válido",
    "status": 400
}

DeleteUserInfo

Método: DELETE

Endpoint: /users/{username@dominio.com}/apps/{AppId}

Código de respuesta: 200

En caso de no encontrar el usuario o la app devolverá un codigo http 400 y el detalle en el body

{
    "type": "about:blank",
    "title": "No se encontró el mapping",
    "status": 400
}

GetUsersByApps

Método: GET

Endpoint: /apps/{AppId}/users

Código de respuesta: 200

QueryParams: domain

Este método devuelve a todos los usuarios para un AppId, en caso de asignar un dominio en el parametro domain, se filtrara por este.

Respuesta

[
    {
        "username": "lolivera@andreani.com",
        "data": {
            "rol": "admin",
            "permissions": [
                "read",
                "write",
                "admin"
            ]
        }
    }
]

GetUsersByAppsFilters

Método: POST

Endpoint: /apps/{AppId}/users

Código de respuesta: 200

Body:

{
    "jsonData.rol" = "usuario"
}
Este método devuelve a todos los usuarios para un AppId, se puede especificar en el body filtros para obtener un subgrupo de usuarios. Los filtros son dinámicos ya que la información es dinámica en la base de datos. Este endpoint permite ejecutar consultas de búsqueda de mongo.

UpdateUserBatch

Método: PUT

Endpoint: /apps/{AppId}/users

Este endpoint permite enviar una solicitud PUT para actualizar un lote de usuarios.

El cuerpo de la solicitud debe seguir la siguiente estructura:

[
  {
    "username": "string",
    "data": "string"
  },
  {
     "Username": "nombre de usuario 1",
     "Data": {
         // Datos de actualización para el usuario 1
     }
 },
 {
     "Username": "nombre de usuario 2",
     "Data": {
         // Datos de actualización para el usuario 2
     }
 }
]

El código de respuesta 200 indica que la solicitud se ha procesado correctamente y los usuarios se han actualizado con éxito.

[
  {
    "username": "string",
    "jsonData": "string"
  }
]

En caso de encontrar un error, se devolverá un código HTTP 400 junto con el siguiente detalle en el cuerpo de la respuesta:

[
  {
    "code": "string",
    "property": "string",
    "message": "string"
  }
]

El método UpdateUserBatchHandler se encarga de manejar la lógica de actualización de usuarios en lotes, utilizando el identificador de la aplicación y los datos de actualización proporcionados en el cuerpo de la solicitud.

MongoDB (DB: APIClaimsb2cDB)

La información almacenada se divide en 2 tipos de colecciones. Una colección llamada users que responde al siguiente esquema:

{
  "properties": {
    "_id": { "bsonType": "objectId" },
    "username": { "bsonType": "string" },
    "apps": {
      "type": "array",
      "items" : {
        "type" : "object",
        "properties" : {
          "appId": { "bsonType":"string"},
          "appName": { "bsonType":"string"},
          "lastLogon": { "bsonType":"long"}
        }
      }
    }
  }
}

Luego tenemos una colección por applicationId que generalmente es un GUID como el siguiente a2d64249-d82a-44b9-aaf2-952653aaf3ca, estas colecciones responden al siguiente esquema:

{
  "properties": {
    "_id": { "bsonType": "objectId" },
    "username": { "bsonType": "string" },
    "jsonData": {
      "type": "object",
      "properties" : {
        "key1": { "bsonType":"string"},
        "key2": { "bsonType":"string"}
      }
    }
  }
}

Las propiedades dentro de jsonData son dinámicas y representan a un diccionario clave-valor, donde se podrán almacenar los valores aleatorios propios de cada aplicación. El contenido de este campo es el valor devuelto por la Validation Api, y el mismo es agregado al token retornado por Azure B2C.