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:
Nombre | Descripción | Ruta |
---|---|---|
serverUrl | Tu URL del servidor Casdoor | src/App.js |
clientId | El ID de Cliente de tu aplicación Casdoor | src/App.js |
appName | El nombre de tu aplicación Casdoor | src/App.js |
redirectPath | La ruta de la URL de redirección para tu aplicación Casdoor, será /callback si no se proporciona | src/App.js |
clientSecret | El Secreto del Cliente de tu aplicación Casdoor | src/App.js |
casdoorServiceDomain | Tu URL del servidor Casdoor | public/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. 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. 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. Puedes previsualizar todo el proceso en la imagen gif a continuación.
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.