Files
express-otp/src/example/server.ts
2022-11-29 12:29:02 +02:00

65 lines
1.5 KiB
TypeScript

import express from 'express'
import otp from '..'
import dotenv from 'dotenv'
dotenv.config()
const app = express()
const sampleUser = {
id: 1,
username: process.env.USER_NAME!,
secret: process.env.USER_SECRET!,
}
const totp = otp<typeof sampleUser>({
issuer: 'my-issuer',
getUser(req) {
const user = [sampleUser].find((x) => x.username === req.query.username)
if (!user) {
return undefined
}
return { user, secret: user.secret, username: user.username }
},
errorResponse(req, res, next, error) {
res.send(error.message)
res.status(401)
},
})
app.use('/generate', (req, res) => res.status(200).send(totp.generateNewSecret()))
app.use('/token/uri', async (req, res) =>
res
.status(200)
.setHeader('Content-Type', 'text/plain')
.send(totp.generateSecretURL(sampleUser.username, sampleUser.secret)),
)
app.use('/token/qr', async (req, res) =>
res
.status(200)
.setHeader('Content-Type', 'text/html')
.send(
'<img src="' +
(await totp.generateSecretQR(sampleUser.username, sampleUser.secret)) +
'" style="width: 100%; height: 100%; object-fit: contain; image-rendering: pixelated;" />',
),
)
app.use(
'/verify',
totp.authenticate({
tokenForm: true,
}),
(req, res) => {
res.setHeader('Content-Type', 'text/plain')
res.send('Logged in as user ' + JSON.stringify(req.user))
res.status(200)
},
)
app.listen(3000, () => {
console.log('Server is running on port 3000')
})