const express = require("express"); const session = require("express-session"); const { Issuer } = require("openid-client"); const wol = require("wake_on_lan"); const app = express(); const PORT = process.env.PORT || 3000; const REDIRECT_URI = process.env.REDIRECT_URI || "http://127.0.0.1:3000/callback"; app.use(session({ secret: process.env.COOKIE_SECRET, saveUninitialized: false, cookie: { maxAge: 10 * 60 * 1000 } })); function expandHtml(body) { return ` ${body} ` } let client; (async () => { const issuer = await Issuer.discover(process.env.OIDC_WELL_KNOWN_URL); client = new issuer.Client({ client_id: process.env.CLIENT_ID, client_secret: process.env.CLIENT_SECRET, redirect_uris: [REDIRECT_URI], response_types: ["code"] }); app.get("/", (req, res) => { if (req.session.user) { res.send(expandHtml(`

喚醒 PinLin3770

已登入為身分 ${req.session.user.sub}


喚醒 PinLin3770 `)); } else { res.send(expandHtml(`

喚醒 PinLin3770

點此登入 `)); } }); app.get("/login", (req, res) => { const url = client.authorizationUrl({ scope: "openid profile", redirect_uri: REDIRECT_URI }); res.redirect(url); }); app.get("/callback", async (req, res) => { try { const params = client.callbackParams(req); const tokenSet = await client.callback(REDIRECT_URI, params); const userinfo = await client.userinfo(tokenSet.access_token); req.session.user = userinfo; res.redirect("/"); } catch (err) { res.send(expandHtml(`

⚠️ 登入失敗

${err}

回首頁`)); } }); app.get("/wakeup3770", (req, res) => { if (!req.session.user) return res.redirect("/"); wol.wake(process.env.MAC_ADDRESS, (error) => { if (error) { return res.send(expandHtml(`

⚠️ 發送魔法封包失敗

${error}

回首頁`)); } res.send(expandHtml(`

✅ 已經發送魔法封包

回首頁`)); }); }); app.post("/logout", (req, res) => { req.session.destroy(() => { res.redirect("/"); }); }); app.listen(PORT, () => { console.log(`wakeup3770 listening at http://localhost:${PORT}`); }); })();