diff options
| author | Adam Soltys <[email protected]> | 2020-06-23 14:39:41 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2020-06-23 14:39:41 -0700 |
| commit | d6af21064d106e6179d76e0dddee049c5e7c0fc5 (patch) | |
| tree | d6cf57a7659a6e60ad80992c8f93dcc59c11c770 /routes/lnurl.js | |
| parent | 3c46dc86b753cdfd71da7b8bb86710032668b5eb (diff) | |
| download | coinos-server-d6af21064d106e6179d76e0dddee049c5e7c0fc5.tar.gz coinos-server-d6af21064d106e6179d76e0dddee049c5e7c0fc5.zip | |
lnurl auth
Diffstat (limited to 'routes/lnurl.js')
| -rw-r--r-- | routes/lnurl.js | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/routes/lnurl.js b/routes/lnurl.js new file mode 100644 index 00000000..e9c1f930 --- /dev/null +++ b/routes/lnurl.js @@ -0,0 +1,75 @@ +const axios = require("axios"); +const lnurl = require("lnurl"); +const jwt = require("jsonwebtoken"); + +logins = {}; + +lnurlServer = lnurl.createServer(config.lnurl); + +app.get("/loginUrl", async (req, res) => { + try { + const result = await lnurlServer.generateNewUrl("login"); + const { username } = req.query; + + if (username !== "undefined") { + logins[result.secret] = username; + } + + res.send(result); + } catch (e) { + l.error(e.message); + res.status(500).send(e.message); + } +}); + +app.get("/decode", async (req, res) => { + const { text } = req.query; + + try { + const decoded = lnurl.decode(text); + let result = await axios.get(decoded); + res.send(result.data); + } catch (e) { + l.error(e.message); + res.status(500).send(e.message); + } +}); + +lnurlServer.bindToHook("login", async params => { + try { + const { k1, key } = params; + + const exists = await db.Key.findOne({ + where: { hex: key }, + include: [{model: db.User, as: "user" }] + }); + + let user; + if (logins[k1]) { + const username = logins[k1]; + user = await db.User.findOne({ + where: { username } + }); + + const k = await db.Key.create({ + user_id: user.id, + hex: key, + }); + + l.info("added key", username, k); + emit(username, 'key', k); + } + else if (exists) ({ user } = exists); + else return; + + if (user && user.username) { + const payload = { username: user.username }; + const token = jwt.sign(payload, config.jwt); + const ws = sessions[key]; + if (ws && ws.send) + ws.send(JSON.stringify({ type: "token", data: token })); + } + } catch (e) { + l.error(e.message); + } +}); |
