Si te encuentras con la necesidad de generar repositorios en GitHub de manera automatizada puede ser que también necesites generar secretos en estos, para funcionar correctamente con GitHub Actions por ejemplo. Hoy quiero compartir contigo cómo podemos crear secretos dentro de un repositorio de GitHub haciendo uso de Azure Logic Apps.
Cifrar los secretos con LibSodium
El por qué te cuento esto es porque para poder llamar a la API de GitHub con el secreto que queremos dar de alta es necesario que este vaya cifrado con una clave criptográfica que nos proporciona la propia plataforma. Lo mismo ocurre cuando quieres usar el conector de Logic App Create or update a repository secret. Para ello, he creado una función en Azure Function que me ayude con esta tarea:
const _sodium = require('libsodium-wrappers')
module.exports = async function(context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
let key = req.body.key;
let secret = req.body.secret;
await _sodium.ready;
const sodium = _sodium;
// Convert Secret & Base64 key to Uint8Array.
let binkey = sodium.from_base64(key, sodium.base64_variants.ORIGINAL);
let binsec = sodium.from_string(secret);
//Encrypt the secret using LibSodium
let encBytes = sodium.crypto_box_seal(binsec, binkey);
// Convert encrypted Uint8Array to Base64
let output = sodium.to_base64(encBytes, sodium.base64_variants.ORIGINAL);
console.log(output)
context.res = {
// status: 200, /* Defaults to 200 */
body: output
};
}
Como puedes ver, esta utiliza la librería libsodium-wrappers y obtiene de la petición la clave y el secreto a cifrar con la misma y hace el proceso. ¿Cómo recupero esta clave?
Recuperar la clave criptográfica para el cifrado
Gracias a que estamos usando Azure Logic Apps podemos utilizar otro de los conectores llamado Get a repository public key. Previa autenticación, este solo necesita saber el propietario y el nombre del repositorio, donde queremos generar el secreto, para obtener la clave correcta.
Resultado
Si quieres probarlo con un flujo completo podrías montar algo como lo siguiente:
Nota: Lo ideal es que en lugar de utilizar el conector Initialize variable recuperaras los secretos de un servicio como Azure Key Vault, para el cuál también tenemos conector. Pero por simplificidad en el ejemplo lo he dejado con una simple variable en el flujo.
El código de la Azure Function lo tienes en mi GitHub.
¡Saludos!