Saltar al contenido principal
A partir del 28 de julio de 2022, Auth0 permitirá agregar claims personalizados privados sin espacio de nombres a los tokens de acceso y a los . Estos mismos claims también se agregarán a la respuesta del endpoint /userinfo. Para obtener más información sobre los tipos de claims en , lee Claims de JSON Web Token.
Aunque se permite el uso de claims personalizados privados sin espacio de nombres, Auth0 recomienda encarecidamente usar claims personalizados públicos con espacio de nombres siempre que sea posible. Los claims personalizados públicos con espacio de nombres son la mejor manera de evitar cualquier colisión con futuros claims añadidos al estándar.

Ejemplo

Anteriormente, Auth0 solo permitía claims con espacio de nombres en los token de acceso y los ID Tokens. Con la migración a claims personalizados, los claims sin espacio de nombres pueden usarse en los , los ID Tokens y el endpoint /userinfo de la Authentication API de Auth0.
// un Auth0 Action 
exports.onExecutePostLogin = async (event, api) => {

  // claims personalizados públicos con espacio de nombres 
  api.accessToken.setCustomClaim('https://myDomain.com/myClaim', 'this is a public, namespaced claim');
  api.idToken.setCustomClaim('https://myDomain.com/myClaim', 'this is a public, namespaced claim');

  // claims personalizados sin espacio de nombres
  api.accessToken.setCustomClaim('myClaim', 'this is a private, non namespaced claim');
  api.idToken.setCustomClaim('myClaim', 'this is a private, non namespaced claim');
};

Flujos afectados

Todos los flujos de Connect (OIDC) compatibles con Auth0 se ven afectados por esta migración. Para revisar la lista de flujos, consulte Flujos de autenticación y autorización. Las siguientes características también se ven afectadas: Las siguientes características se ven afectadas solo cuando se usan junto con Auth0 Rules y la asignación de atributos:

Restricciones

Tamaño máximo del token

Auth0 limitará la carga útil de los claims personalizados a un máximo de 100KB. Es importante asegurarse de que la carga útil no supere este límite; de lo contrario, la transacción de autenticación fallará con un error. Le recomendamos revisar el uso que hace del código de extensibilidad (es decir, Rules, Hooks o Actions). En particular, revise las cargas útiles de gran tamaño provenientes de APIs externas. Para evitar errores, Auth0 recomienda usar la carga útil de token más pequeña posible para que su aplicación funcione. Es posible que deba eliminar las propiedades que no sean esenciales antes de definir el valor del claim personalizado.
Esta restricción se aplica al tamaño total de la carga útil de todos sus claims personalizados. Esto incluye tanto los nombres de los claims personalizados como sus valores asociados, ya sean públicos con espacio de nombres o privados sin espacio de nombres.
El límite de 100KB se aplica por separado a los tokens de acceso y a los ID Tokens. Por ejemplo, en la misma transacción se pueden devolver un token de acceso de 100KB y un ID Token de 100KB.

Ejemplos

// un Auth0 action 
exports.onExecutePostLogin = async (event, api) => {

  // obteniendo una carga útil superior a 100KB
  const aHeavyPayload = getHeavyPayload();

  // esto fallará la autenticación
  api.idToken.setCustomClaim('myclaim', aHeavyPayload);

};
// un Auth0 Action 
exports.onExecutePostLogin = async (event, api) => {

  // obteniendo una carga útil de 50KB
  const a50KBPayload = getHeavyPayload();

  // obteniendo otra carga útil de 50KB
  const another50KBPayload = getHeavyPayload();

  // esto fallará en la autenticación
  api.idToken.setCustomClaim('myclaim', a50KBPayload);
  api.idToken.setCustomClaim('https://myDomain.com/myClaim', another50KBPayload);

};
// un Auth0 action 
exports.onExecutePostLogin = async (event, api) => {

  // obteniendo una carga útil de 50KB
  const a50KBPayload = getHeavyPayload();

  // obteniendo otra carga útil de 50KB
  const another50KBPayload = getHeavyPayload();

  // esto se ejecutará correctamente
  api.accessToken.setCustomClaim('myclaim', a50KBPayload);
  api.idToken.setCustomClaim('https://myDomain.com/myClaim', another50KBPayload);

};

Claims restringidos

Auth0 restringe la personalización de los claim usados en los estándares OIDC u OAuth2, así como de los claim de uso interno. Cualquier intento de modificar uno de estos claim se ignorará. La transacción no fallará, pero el claim no se agregará a los tokens. Auth0 recomienda usar un claim público con espacio de nombres.
  • acr
  • act
  • active
  • amr
  • at_hash
  • ath
  • attest
  • aud
  • auth_time
  • authorization_details
  • azp
  • c_hash
  • client_id
  • cnf
  • cty
  • dest
  • entitlements
  • events
  • exp
  • groups
  • gty
  • htm
  • htu
  • iat
  • internalService
  • iss
  • jcard
  • jku
  • jti
  • jwe
  • jwk
  • kid
  • may_act
  • mky
  • nbf
  • nonce
  • object_id
  • org_id
  • org_name
  • orig
  • origid
  • permissions
  • roles
  • rph
  • s_hash
  • sid
  • sip_callid
  • sip_cseq_num
  • sip_date
  • sip_from_tag
  • sip_via_branch
  • sub
  • sub_jwk
  • toe
  • txn
  • typ
  • uuid
  • vot
  • vtm
  • x5t#S256

Ejemplo

// un Auth0 Action 
exports.onExecutePostLogin = async (event, api) => {

  // esto será ignorado
  api.accessToken.setCustomClaim('roles', 'this is a role, but Auth0 will ignore it');

  // esto se ejecutará correctamente y aparecerá en el token
  api.idToken.setCustomClaim('https://myDomain.com/roles', 'this is a role');

};

Audiencia restringida del token

Auth0 restringirá la creación de claims personalizados privados sin espacio de nombres en tokens de acceso cuya sea una API de Auth0. Se ignorará cualquier intento de establecer un claim personalizado privado sin espacio de nombres en un token de acceso cuya audiencia sea una API de Auth0. La transacción no fallará, pero el claim no se agregará a tu token. Auth0 recomienda no establecer claims personalizados en tokens que vayan a consumir las API de Auth0.
  • Los ID Token no se ven afectados por esta restricción.
  • Los claims personalizados públicos con espacio de nombres no se ven afectados por esta restricción.
La siguiente audiencia restringirá la creación de claims personalizados privados sin espacio de nombres:
  • https://YOUR_TENANT.auth0.com/api o https://YOUR_TENANT.auth0app.com/api
  • https://YOUR_TENANT.auth0.com/api/v2 o https://YOUR_TENANT.auth0app.com/api/v2
  • https://YOUR_TENANT.auth0.com/mfa o https://YOUR_TENANT.auth0app.com/mfa
La excepción a esta restricción es la audiencia /userinfo de Auth0. Se permiten claims personalizados privados sin espacio de nombres en la siguiente audiencia:
  • https://YOUR_TENANT.auth0.com/userinfo
  • https://YOUR_TENANT.auth0app.com/userinfo

Ejemplos

// una Auth0 action 
exports.onExecutePostLogin = async (event, api) => {

  // estos serán ignorados si la audiencia es una audiencia de Auth0
  api.accessToken.setCustomClaim('myATclaim', 'this is a claim');
  api.accessToken.setCustomClaim('https://myDomain.com/myATclaim', 'this is a claim');

  // estos se ejecutarán correctamente, no están afectados por la restricción de audiencia
  api.idToken.setCustomClaim('myIdTclaim', 'this is a claim');
  api.idToken.setCustomClaim('https://myDomain.com/myIdTclaim', 'this is a claim');

};
En el siguiente ejemplo se muestra la respuesta devuelta con claims personalizados si la audiencia no es una API de Auth0:
-- Un flujo de contraseña del propietario del recurso 
POST https://{yourTenant}.auth0.com/oauth/token

grant_type:password
username:***
password:***
client_id:***
client_secret:***
audience:https://{yourApi}.com -- Nota la audiencia, se trata de una API personalizada
scope:openid profile
El siguiente ejemplo muestra la respuesta que se devuelve con claims personalizados que no se añadieron mediante una audiencia de API de Auth0:
-- Un flujo de contraseña del propietario del recurso 
POST https://{yourTenant}.auth0.com/oauth/token

grant_type:password
username:***
password:***
client_id:***
client_secret:***
audience:https://{yourTenant}.auth0.com/api/v2/ -- Esta es una audiencia de Auth0 
scope:openid profile
// El token de acceso devuelto por Auth0
{
  "iss": "https://{yourTenant}.auth0.com/",
  "sub": ***,
  "aud": [
    "https://{yourTenant}.auth0.com/api/v2/",
    "https://{yourTenant}.auth0.com/userinfo"
  ],
  "iat": 1655283444,
  "exp": 1655369844,
  "azp": ***,
  "scope": "openid profile",
  "gty": "password",

  // Se agregó el claim personalizado público con espacio de nombres, porque no está sujeto a esta restricción
  // Sin embargo, el claim personalizado privado sin espacio de nombres {myATclaim} fue ignorado
  "https://mydomain.com/{myATclaim}": "this is a claim"
}

Restricción sobre los espacios de nombres de Auth0 y Webtask

Auth0 restringirá la creación de claims personalizados con espacio de nombres que usen un dominio de Auth0 como identificador del espacio de nombres. Los dominios de Auth0 son:
  • auth0.com
  • webtask.io
  • webtask.run
Cualquier intento de establecer un claim personalizado con espacio de nombres en un token usando uno de los dominios anteriores como identificador se ignorará. La transacción no fallará, pero el claim no se agregará a tu token.
Antes de esta migración, al establecer un claim personalizado con espacio de nombres con un dominio de Auth0 como identificador, el claim aparecía en la respuesta de /userinfo. Este comportamiento desaparece después de la migración, y esos claims personalizados se ignoran por completo.
// un Auth0 Action 
exports.onExecutePostLogin = async (event, api) => {

  // ninguno de estos se añadirá a los tokens ni a la respuesta de /userinfo
  api.idToken.setCustomClaim('https://example.auth0.com', 'this is a claim');
  api.idToken.setCustomClaim('https://example.webtask.io', 'this is a claim');
  api.idToken.setCustomClaim('https://example.webtask.run', 'this is a claim');

};

Claims del perfil de usuario de OIDC

Auth0 ahora permite agregar claims del perfil de usuario de OIDC a los tokens de acceso. Antes de esta migración, los intentos de agregar claims del perfil de usuario de OIDC al token de acceso se ignoraban sin notificación. Con el comportamiento actualizado, los tokens de acceso contendrán estos claims del perfil de usuario de OIDC.
Si agrega claims del perfil de usuario de OIDC a los tokens de acceso, se aplican las mismas restricciones de scope que a los ID Token. Por ejemplo, para agregar el claim email a los tokens de acceso, el flujo debe activarse con un scope que incluya email.
Puede agregar los siguientes claims del perfil de usuario de OIDC a los tokens de acceso:
  • address
  • birthdate
  • email
  • email_verified
  • family_name
  • gender
  • given_name
  • locale
  • middle_name
  • name
  • nickname
  • phone_number
  • phone_number_verified
  • picture
  • preferred_username
  • profile
  • updated_at
  • website
  • zoneinfo

Ejemplo

// un Auth0 action 
exports.onExecutePostLogin = async (event, api) => {

  // esto se ignoraba hasta ahora. A partir de esta migración, el claim se agregará a los tokens de acceso 
  // si el scope contiene 'email'
  api.accessToken.setCustomClaim('email', 'myemail@domin.com');

  // esto se ignoraba hasta ahora. A partir de esta migración, el claim se agregará a los tokens de acceso 
  // si el scope contiene 'profile'
  api.accessToken.setCustomClaim('family_name', 'A family name');

};

Asignación de atributos del complemento SAML2 y del protocolo Web Service Federation (WS-Fed) con Auth0 Rules

Al igual que al usar Auth0 Rules para realizar cambios en el objeto de usuario, los claims de pre-migración de app_metadata o user_metadata también combinan su contenido cuando el claim se establece en el objeto context.idToken y hay conflictos de nombres. Para obtener más información sobre las propiedades del objeto, consulte Propiedades del objeto de usuario en Rules. Sin embargo, al usar claims personalizados, Auth0 da prioridad al claim que se estableció en el objeto context.idToken. Este cambio afecta a las Rules de Auth0 que establecen app_metadata y user_metadata mediante context.id_token (asignándoles objetos) y, al mismo tiempo, usan estos campos en la asignación de atributos para el complemento o el protocolo (WS-Fed). Ejemplo 1: Auth0 ignora la asignación de atributos cuando context.idToken.app_metadata se establece con un objeto vacío.
// un Rule de Auth0
function (user, context, callback) {

  user.app_metadata.a_claim = 'This is a claim';
  user.app_metadata.another_claim = 'This is a another claim';

  context.samlConfiguration = context.samlConfiguration || {};

  context.samlConfiguration.mappings = {
    "a_claim": "app_metadata.a_claim",
    "another_claim": "app_metadata.another_claim"
  };

  context.idToken.app_metadata = {};

  return callback(null, user, context);
}
Respuesta de SAML antes de esta migración:
<samlp:Response>
    (...)
    <saml:Assertion>
        (...)
        <saml:AttributeStatement xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <saml:Attribute Name="a_claim" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
                <saml:AttributeValue xsi:type="xs:string">
                    This is a claim
                </saml:AttributeValue>
            </saml:Attribute>
            <saml:Attribute Name="another_claim" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
                <saml:AttributeValue xsi:type="xs:string">
                    This is a another claim
                </saml:AttributeValue>
            </saml:Attribute>
        </saml:AttributeStatement>
    </saml:Assertion>
</samlp:Response>
Respuesta de SAML con el comportamiento actualizado:
<samlp:Response>
    (...)
    <saml:Assertion>
        (...)
        <saml:AttributeStatement xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
    </saml:Assertion>
</samlp:Response>
Ejemplo 2: La versión de app_metadata en context.id_token prevalece.
// un Rule de Auth0
function (user, context, callback) {

  user.app_metadata.a_claim = 'This is a claim';
  user.app_metadata.another_claim = 'This is a another claim';

  context.samlConfiguration = context.samlConfiguration || {};

  context.samlConfiguration.mappings = {
    "a_claim": "app_metadata.a_claim",
    "another_claim": "app_metadata.another_claim",
    "claim_set_via_id_token": "app_metadata.claim_set_via_id_token"
  };

  context.idToken.app_metadata = {
  	claim_set_via_id_token: "This is a claim which was set via context.idToken"
  };

  return callback(null, user, context);
}
Respuesta de SAML previa a esta migración:
<samlp:Response>
    (...)
    <saml:Assertion>
        (...)
        <saml:AttributeStatement xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <saml:Attribute Name="a_claim">
                <saml:AttributeValue xsi:type="xs:anyType">
                    This is a claim
                </saml:AttributeValue>
            </saml:Attribute>
            <saml:Attribute Name="another_claim">
                <saml:AttributeValue xsi:type="xs:anyType">
                    This is a another claim
                </saml:AttributeValue>
            </saml:Attribute>
            <saml:Attribute Name="claim_set_via_id_token">
                <saml:AttributeValue xsi:type="xs:anyType">
                    This is a claim which was set via context.idToken
                </saml:AttributeValue>
            </saml:Attribute>
        </saml:AttributeStatement>
    </saml:Assertion>
</samlp:Response>
Respuesta SAML con el nuevo comportamiento:
<samlp:Response>
    (...)
    <saml:Assertion>
        (...)
        <saml:AttributeStatement xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <saml:Attribute Name="claim_set_via_id_token" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
                <saml:AttributeValue xsi:type="xs:string">
                    This is a claim which was set via context.idToken
                </saml:AttributeValue>
            </saml:Attribute>
        </saml:AttributeStatement>
    </saml:Assertion>
</samlp:Response>

Agregue claims personalizados privados sin espacio de nombres a los tokens

El comportamiento de los claims personalizados no cambiará para los miembros del programa beta de claims personalizados. Esta función ya está habilitada.
Ahora puede agregar claims personalizados privados sin espacio de nombres a la carga útil de los tokens de acceso y los ID Tokens.

Ejemplo

// un Auth0 Action 
exports.onExecutePostLogin = async (event, api) => {

  // ignorado anteriormente
  // A partir de esta migración, el claim se añadirá a los tokens de acceso
  api.accessToken.setCustomClaim('myATclaim', 'this is a claim');

  // ignorado anteriormente
  // A partir de esta migración, el claim se añadirá a los ID tokens
  api.idToken.setCustomClaim('myIdTclaim', 'this is a claim');

};

Claims privadas sin espacio de nombres en /userinfo

Auth0 ahora devuelve claims personalizados privados sin espacio de nombres en la respuesta de /userinfo cuando se establecen en los ID Tokens.

Ejemplo

// un Auth0 Action 
exports.onExecutePostLogin = async (event, api) => {

  // esto se ignoraba hasta ahora. 
  // A partir de esta migración, este claim se devolverá en /userinfo
  api.idToken.setCustomClaim('myIdTclaim', 'this is a claim');

};
-- una llamada a /userinfo 
GET https://{yourTenant}.auth0.com/userinfo
Authorization: Bearer {yourAccessToken}
// la respuesta de /userinfo
{
    "sub": ***,
    (...)
    "myIdTclaim": "this is a claim"
}

Actions

Revisar los registros del inquilino

Primero, revise los registros de su inquilino para comprobar si hay avisos de deprecación y determinar si su inquilino está afectado por la migración.
  1. Vaya a Auth0 Dashboard > Monitoring > Logs.
  2. Busque en los registros type: depnote AND description: *Custom*claims*.

Ejemplo

A continuación se muestra un ejemplo de registro de deprecación que se genera cada vez que se ejecuta código de extensibilidad.
{
  "date": "2022-06-28T08:12:52.084Z",
  "type": "depnote",
  "description": "Custom claims must be namespaced: This feature is being deprecated. Please see details.feature of this log for more information.",
  "connection_id": "",
  "client_id": ****,
  "client_name": ****,
  "details": {
    "feature": {
      "grant": "password",
      "access_token_claims_to_be_allowed": [
        "myclaim"
      ],
      "access_token_claims_to_be_disallowed": [
        "gty"
      ],
      "id_token_claims_to_be_allowed": [
        "myclaim"
      ],
      "id_token_claims_to_be_disallowed": [
        "gty"
      ],
      "id": "legacy_custom_claims",
      "name": "Custom claims must be namespaced when they are added through rules / actions / hooks."
    }
  },
  "log_id": ****,
  "_id": ****,
  "isMobile": false,
  "user_agent": "Other 0.0.0 / Other 0.0.0",
  "id": ****
}

Corregir las Rules de Auth0 para complemento SAML2 y protocolo Web Service Federation (Ws-Fed)

Si configura claims de app_metadata o user_metadata en el objeto context.idToken mediante complemento SAML2 o protocolo Web Service Federation (Ws-Fed) con Rules de Auth0 junto con la asignación de atributos, deberá actualizar su configuración para adaptarla a la forma en que Auth0 evalúa los nombres de claims en conflicto entre estos objetos. Hay varias soluciones posibles:
  • Asegúrese de que el código de su Rule de Auth0 siempre dé prioridad al contenido de los objetos definidos en context.id_token:
    // my_claim se ignorará; esta línea de código ya no es relevante,
    // es preferible definir my_claim en `context.idToken`
    user.app_metadata.my_claim = 'a value'; 
    
    // esta versión de app_metadata tendrá prioridad sobre cualquier otro cambio 
    context.idToken.app_metadata = {
      another_claim: 'another value'
    };
    
    // Solo `another_claim` aparecerá en las respuestas SAML/WsFed
    
  • Si usa la asignación de atributos de complemento SAML2 o protocolo Web Service Federation (Ws-Fed), evite definir claims de app_metadata o user_metadata en el objeto context.idToken. Sustituya estos claims por claims con espacio de nombres siempre que sea posible:
    context.idToken['https://mydomain.com/app_metadata'] = {
      my_claim: 'my claim'
    };
    
  • Use una condición en el protocolo actual o en el cliente actual para excluir las instrucciones que definen app_metadata o user_metadata cuando el protocolo sea samlp o wsfed.
    if (!['samlp', 'wsfed'].includes(context.protocol)) {
        context.idToken.app_metadata = {
          claim_set_via_id_token: "This is a claim which was set via context.idToken"
        };
    }
    

Deshabilitar el comportamiento legado

Antes de deshabilitar el comportamiento legado, le recomendamos que revise la lista de cambios y verifique que sus aplicaciones e integraciones sean compatibles.
Si su inquilino no tiene esta opción, no se verá afectado y no es necesario realizar ninguna otra acción.
  1. Vaya a Auth0 Dashboard > Tenant Settings > Advanced y busque Migrations.
  2. Use el interruptor para deshabilitar Custom claims must be namespaced.