BLUF: Me gustaría configurar la asociación de tokens de software en AWS Cognito en una aplicación de JavaScript orientada al usuario (mediante AWS SDK) y tengo problemas con los errores "Falta la credencial".
Estoy tratando de crear una aplicación usando AWS Cognito usando Javascript SDK y CognitoIdentityProviderClient que requiere que el usuario use un token de software MFA.
Puedo registrarme y confirmar al usuario usando SignUpCommand y puedo generar una respuesta exitosa para el usuario con InitiateAuthCommand usando el nombre de usuario/contraseña de inicio de sesión (iniciar sesión por primera vez). En ese momento, necesito procesar un desafío MFA_SETUP que requiere el uso de un flujo AssociateSoftwareTokenCommand separado para generar los secretos y las respuestas.
Esperaría poder permitir que el usuario final, mientras inicia sesión a través de su navegador, emita el comando para asociar el token de software después de ingresar con éxito su nombre de usuario/contraseña por primera vez.
El problema con el que me encuentro es que aparece el siguiente error al emitir AssociateSoftwareTokenCommand:
Error: Credential is missing at SignatureV4.credentialProvider (runtimeConfig.browser.js:16) at SignatureV4.<anonymous> (SignatureV4.js:169) at step (tslib.es6.js:102) at Object.next (tslib.es6.js:83) at tslib.es6.js:76 at new Promise (<anonymous>) at __awaiter (tslib.es6.js:72) at SignatureV4.signRequest (SignatureV4.js:165) at SignatureV4.<anonymous> (SignatureV4.js:85) at step (tslib.es6.js:102)Un poco de búsqueda vigorosa en Google y búsqueda a través de StackOverflow, este método requiere un objeto de credencial en la configuración del Cliente, sin embargo, esta credencial, por lo que puedo decir de los documentos de Google/SO/AWS SDK, requiere que cree un objeto IAM y genere claves/un secreto llave.
Mi aplicación (construida con React) se basa principalmente en una sola aplicación/navegador y estoy tratando de evitar una lógica adicional del lado del servidor para actuar como intermediario si es posible, y obviamente no quiero dejar caer claves secretas en interfaces orientadas al usuario. .
Mis preguntas entonces son:
Las líneas de código ofensivas son simples (puedo obtener la clave de sesión válida, no hay problema):
const client = new CognitoIdentityProviderClient({ region: AWS_REGION }); const command = new AssociateSoftwareTokenCommand({Session: session }); const response = await client.send(command) Otras búsquedas me han mostrado que el objeto credentials: {} luego iría en el objeto de configuración del cliente, que parte entiendo, simplemente no quiero poner eso en el lado del cliente con claves secretas, etc.
Gracias por cualquier ayuda.