es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Migrar loginWithUsernamePassword a @azure/identity

Migré parte del código desde @azure/ms-node-auth a @azure/identity, el cual autentica contra Azure Active Directory (AAD) mediante loginWithUsernamePassword. La guía de migración apunta a la clase UsernamePasswordCredential, pero rechaza mi solicitud.

// Fragmento de código funcional con @azure/ms-node-auth
async function getTokenLegacy(): Promise<string> {
  const credentials = await msRestNodeAuth.loginWithUsernamePassword(
    USERNAME,
    PASSWORD, {
      domain: AAD<em>TENANT</em>ID,
      clientId: CUSTOM<em>CLIENT</em>ID,
      tokenAudience: CUSTOM<em>APP</em>ID,
    },
  );
  return (await credentials.getToken()).accessToken;
}

// Versión migrada @azure/identity no funcional
async function getTokenMigrated(): Promise<string> {
  const credentials = new UsernamePasswordCredential(
    AAD<em>TENANT</em>ID, 
    CUSTOM<em>CLIENT</em>ID, 
    USERNAME, 
    PASSWORD);
  return (await credentials.getToken(CUSTOM<em>APP</em>ID)).token;
}

Se produce el siguiente error:
AADSTS50126: Error al validar las credenciales debido a un nombre de usuario o contraseña no válidos.

El usuario tiene una cuenta federada y @azure/ms-rest-nodeauth verifica las credenciales mediante el protocolo SAML.

UserRealm: VERBOSE: Respuesta de UserRealm:
UserRealm: VERBOSE:  Tipo de cuenta:       federada
UserRealm: VERBOSE:  Protocolo de federación:    wstrust
TokenRequest: VERBOSE: Adquisición de token con nombre de usuario y contraseña para usuario federado
...
WSTrustResponse: INFO: Se encontró un token del tipo: urn:oasis:names:tc:SAML:1.0:assertion
TokenRequest: VERBOSE: Realizando intercambio de tipo de concesión de OAuth con afirmación.
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con el hecho de que el usuario tiene una cuenta federada y la clase UsernamePasswordCredential en @azure/identity no admite el protocolo SAML que es utilizado por ms-rest-nodeauth para verificar las credenciales.

    Una solución a este problema podría ser utilizar la clase DeviceCodeCredential en lugar de UsernamePasswordCredential. Esta clase admite la autenticación tanto para cuentas federadas como para cuentas no federadas, y no requiere que el usuario ingrese sus credenciales directamente en la aplicación.

    Aquí tienes un ejemplo de cómo utilizar DeviceCodeCredential:

    import { DeviceCodeCredential } from "@azure/identity";
    
    async function getTokenMigrated(): Promise<string> {
      const credential = new DeviceCodeCredential({ 
        tokenAudience: CUSTOM_APP_ID, 
        clientId: CUSTOM_CLIENT_ID 
      });
      return (await credential.getToken()).accessToken;
    }
    

    Con este enfoque, el usuario recibirá un mensaje en su dispositivo con un código único que luego podrá ingresar en la aplicación para completar el proceso de autenticación.

    Otra solución podría ser utilizar un flujo de autenticación diferente que sea soportado por @azure/identity, como OAuth 2.0 con PKCE. Este flujo es más seguro que loginWithUsernamePassword, ya que no requiere que la aplicación almacene las credenciales del usuario. Sin embargo, puede ser más complejo de implementar.

    En cualquier caso, se recomienda seguir la guía de migración proporcionada por @azure/identity al migrar de ms-rest-nodeauth, y evaluar cuidadosamente los requisitos de autenticación de la aplicación antes de seleccionar un flujo de autenticación.

Comments are closed.