Files
wakeup3770/index.js
2025-04-04 02:26:47 +08:00

108 lines
2.8 KiB
JavaScript
Executable File

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 `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: sans-serif; padding: 1.5rem; font-size: 1.2rem; }
a, button { font-size: 1.1rem; }
</style>
</head>
<body>
${body}
</body>
</html>
`
}
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(`
<h1>喚醒 PinLin3770</h1>
<p>已登入為身分 ${req.session.user.sub}</p>
<form method="POST" action="/logout">
<button type="submit">登出</button>
</form>
<br>
<a href="/wakeup3770">喚醒 PinLin3770</a>
`));
} else {
res.send(expandHtml(`
<h1>喚醒 PinLin3770</h1>
<a href="/login">點此登入</a>
`));
}
});
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(`<p>⚠️ 登入失敗</p><p>${err}</p><a href="/">回首頁</a>`));
}
});
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(`<p>⚠️ 發送魔法封包失敗</p><p>${error}</p><a href="/">回首頁</a>`));
}
res.send(expandHtml(`<p>✅ 已經發送魔法封包</p><a href="/">回首頁</a>`));
});
});
app.post("/logout", (req, res) => {
req.session.destroy(() => {
res.redirect("/");
});
});
app.listen(PORT, () => {
console.log(`wakeup3770 listening at http://localhost:${PORT}`);
});
})();