Saltar al contenido principal

Ejemplo de Aplicación Electron para Casdoor

Un ejemplo de aplicación Electron que demuestra las capacidades de integración de Casdoor.

Cómo Ejecutar el Ejemplo

Inicialización

Necesitas inicializar 6 parámetros, todos los cuales son de tipo cadena:

NombreDescripciónRuta
serverUrlTu URL del servidor Casdoorsrc/App.js
clientIdEl ID de Cliente de tu aplicación Casdoorsrc/App.js
appNameEl nombre de tu aplicación Casdoorsrc/App.js
redirectPathLa ruta de la URL de redirección para tu aplicación Casdoor, será /callback si no se proporcionasrc/App.js
clientSecretEl Secreto del Cliente de tu aplicación Casdoorsrc/App.js
casdoorServiceDomainTu URL del servidor Casdoorpublic/electron.js

Si no configuras estos parámetros, este proyecto usará la demostración en línea de Casdoor como el servidor Casdoor predeterminado y usará Casnode como la aplicación Casdoor predeterminada.

Comandos Disponibles

En el directorio del proyecto, puedes ejecutar:

npm run dev o yarn dev

Construye la aplicación electron y ejecuta esta aplicación.

npm run make o yarn make

Empaqueta y distribuye tu aplicación. Creará la carpeta out donde se ubicará tu paquete:

// Example for macOS out/  
├── out/make/zip/darwin/x64/casdoor-electron-example-darwin-x64-1.0.0.zip
├── ...
└── out/casdoor-electron-example-darwin-x64/casdoor-electron-example.app/Contents/MacOS/casdoor-electron-example

Vista Previa

Una vez que ejecutes esta aplicación Electron, aparecerá una nueva ventana en tu escritorio. Electron Login Si haces clic en el botón Login with Casdoor, tu navegador predeterminado se abrirá automáticamente y mostrará la página de inicio de sesión. Vista del Navegador Después de un inicio de sesión exitoso, tu aplicación Electron se abrirá y tu nombre de usuario se mostrará en tu aplicación. Electron Logout Puedes previsualizar todo el proceso en la imagen gif a continuación. Gif de Vista Previa de Electron

Pasos de Integración

Establecer el protocolo personalizado

Primero, necesitas establecer el protocolo personalizado llamado casdoor.

const protocol = "casdoor";

if (process.defaultApp) {
if (process.argv.length >= 2) {
app.setAsDefaultProtocolClient(protocol, process.execPath, [
path.resolve(process.argv[1]),
]);
}
} else {
app.setAsDefaultProtocolClient(protocol);
}

Esto permitirá que el navegador abra tu aplicación electron y envíe la información de inicio de sesión a la aplicación electron.

Abrir la URL de inicio de sesión en el navegador

const serverUrl = "https://door.casdoor.com";
const appName = "app-casnode";
const redirectPath = "/callback";
const clientId = "014ae4bd048734ca2dea";
const clientSecret = "f26a4115725867b7bb7b668c81e1f8f7fae1544d";

const redirectUrl = "casdoor://localhost:3000" + redirectPath;

const signinUrl = `${serverUrl}/login/oauth/authorize?client_id=${clientId}&response_type=code&redirect_uri=${encodeURIComponent(redirectUrl)}&scope=profile&state=${appName}&noRedirect=true`;

shell.openExternal(signinUrl); //Open the login url in the browser

Puedes cambiar los primeros cinco parámetros.

Escuchar el evento de apertura de la aplicación

Una vez que inicies sesión con éxito a través del navegador, el navegador abrirá tu aplicación Electron. Por lo tanto, debes escuchar el evento de apertura de la aplicación.

const gotTheLock = app.requestSingleInstanceLock();
const ProtocolRegExp = new RegExp(`^${protocol}://`);

if (!gotTheLock) {
app.quit();
} else {
app.on("second-instance", (event, commandLine, workingDirectory) => {
if (mainWindow) {
if (mainWindow.isMinimized()) mainWindow.restore();
mainWindow.focus();
commandLine.forEach((str) => {
if (ProtocolRegExp.test(str)) {
const params = url.parse(str, true).query;
if (params && params.code) {
store.set("casdoor_code", params.code);
mainWindow.webContents.send("receiveCode", params.code);
}
}
});
}
});
app.whenReady().then(createWindow);

app.on("open-url", (event, openUrl) => {
const isProtocol = ProtocolRegExp.test(openUrl);
if (isProtocol) {
const params = url.parse(openUrl, true).query;
if (params && params.code) {
store.set("casdoor_code", params.code);
mainWindow.webContents.send("receiveCode", params.code);
}
}
});
}

Puedes obtener el código desde el navegador, que es casdoor_code o params.code.

Analizar el código y obtener la información del usuario

async function getUserInfo(clientId, clientSecret, code) {
const { data } = await axios({
method: "post",
url: authCodeUrl,
headers: {
"content-type": "application/json",
},
data: JSON.stringify({
grant_type: "authorization_code",
client_id: clientId,
client_secret: clientSecret,
code: code,
}),
});
const resp = await axios({
method: "get",
url: `${getUserInfoUrl}?accessToken=${data.access_token}`,
});
return resp.data;
}

ipcMain.handle("getUserInfo", async (event, clientId, clientSecret) => {
const code = store.get("casdoor_code");
const userInfo = await getUserInfo(clientId, clientSecret, code);
store.set("userInfo", userInfo);
return userInfo;
});

Finalmente, puedes analizar el código y obtener la información del usuario siguiendo la página de documentación de OAuth.