summaryrefslogtreecommitdiff
path: root/webapp/main.js
diff options
context:
space:
mode:
authord0x471b <0x471@protonmail.com>2022-12-31 03:45:30 +0300
committerd0x471b <0x471@protonmail.com>2022-12-31 03:45:30 +0300
commit0f1d7d51de1baa21256fdb7ddafe54aab66172f7 (patch)
tree30373f9b64ba6301096f26cdade55ebac4f5e59f /webapp/main.js
parent517ad8d13a6b23328927154226575605be70669f (diff)
Add webappHEADmaster
Diffstat (limited to 'webapp/main.js')
-rw-r--r--webapp/main.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/webapp/main.js b/webapp/main.js
new file mode 100644
index 0000000..fd445a4
--- /dev/null
+++ b/webapp/main.js
@@ -0,0 +1,71 @@
+const express = require('express')
+const app = express()
+const jwt = require('jsonwebtoken')
+const Web3 = require('web3')
+const port = 4000
+
+const web3 = new Web3('https://cloudflare-eth.com/')
+const jwtSecret = 'some very secret value'
+
+app.use(express.static('public'))
+
+app.get('/nonce', (req, res) => {
+ const nonce = new Date().getTime()
+ const address = req.query.address
+
+ const tempToken = jwt.sign({ nonce, address }, jwtSecret, { expiresIn: '60s' })
+ const message = getSignMessage(address, nonce)
+
+ res.json({ tempToken, message })
+})
+
+app.post('/verify', async (req, res) => {
+ const authHeader = req.headers['authorization']
+ const tempToken = authHeader && authHeader.split(" ")[1]
+
+ if (tempToken === null) return res.sendStatus(403)
+
+ const userData = await jwt.verify(tempToken, jwtSecret)
+ const nonce = userData.nonce
+ const address = userData.address
+ const message = getSignMessage(address, nonce)
+ const signature = req.query.signature
+
+ const verifiedAddress = await web3.eth.accounts.recover(message, signature)
+
+ if (verifiedAddress.toLowerCase() == address.toLowerCase()) {
+ const token = jwt.sign({ verifiedAddress }, jwtSecret, { expiresIn: '1d' })
+ res.json({ token })
+ } else {
+ res.sendStatus(403)
+ }
+})
+
+app.get('/secret', authenticateToken, async (req, res) => {
+ res.send(`Welcome address ${req.authData.verifiedAddress}`)
+})
+
+function authenticateToken(req, res, next) {
+ const authHeader = req.headers['authorization']
+ const token = authHeader && authHeader.split(' ')[1]
+
+ if (token == null) return res.sendStatus(401)
+
+ jwt.verify(token, jwtSecret, (err, authData) => {
+ console.log(err)
+
+ if (err) return res.sendStatus(403)
+
+ req.authData = authData
+
+ next()
+ })
+}
+
+const getSignMessage = (address, nonce) => {
+ return `Please sign this message for address ${address}:\n\n${nonce}`
+}
+
+app.listen(port, () => {
+ console.log(`Example app listening on port ${port}`)
+}) \ No newline at end of file