Перейти к основному содержанию

Пример приложения Electron для Casdoor

Пример приложения Electron, демонстрирующий возможности интеграции Casdoor.

Как запустить пример

Инициализация

Вам нужно инициализировать 6 параметров, все из которых являются строковыми типами:

ИмяОписаниеПуть
serverUrlURL вашего сервера Casdoorsrc/App.js
clientIdID клиента вашего приложения Casdoorsrc/App.js
appNameИмя вашего приложения Casdoorsrc/App.js
redirectPathПуть URL-адреса перенаправления для вашего приложения Casdoor, будет /callback, если не предоставленsrc/App.js
clientSecretСекрет клиента вашего приложения Casdoorsrc/App.js
casdoorServiceDomainURL вашего сервера Casdoorpublic/electron.js

Если вы не установите эти параметры, этот проект будет использовать Casdoor онлайн-демо в качестве сервера Casdoor по умолчанию и Casnode в качестве приложения Casdoor по умолчанию.

Доступные команды

В директории проекта вы можете выполнить:

npm run dev или yarn dev

Собирает приложение Electron и запускает это приложение.

npm run make или yarn make

Упаковывает и распространяет ваше приложение. Это создаст папку out, где будет расположен ваш пакет:

// 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

Предварительный просмотр

Как только вы запустите это приложение Electron, на вашем рабочем столе появится новое окно. Электронный вход Если вы нажмете кнопку Login with Casdoor, ваш браузер по умолчанию автоматически откроется и покажет страницу входа. Просмотр в браузере После успешного входа ваше приложение Electron откроется, и ваше имя пользователя будет отображаться в вашем приложении. Электронный выход Вы можете просмотреть весь процесс в gif-изображении ниже. Gif предварительного просмотра Electron

Шаги интеграции

Установить пользовательский протокол

Во-первых, вам нужно установить пользовательский протокол под названием 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);
}

Это позволит браузеру открыть ваше приложение Electron и отправить информацию о входе в приложение Electron.

Открыть URL входа в браузере

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

Вы можете изменить первые пять параметров.

Слушать событие открытия приложения

Как только вы успешно войдете через браузер, браузер откроет ваше приложение Electron. Поэтому вы должны слушать событие открытия приложения.

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);
}
}
});
}

Вы можете получить код из браузера, который будет casdoor_code или params.code.

Разобрать код и получить информацию о пользователе

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;
});

Наконец, вы можете разобрать код и получить информацию о пользователе, следуя странице документации OAuth.