7 changed files with 115 additions and 1 deletions
@ -0,0 +1,26 @@ |
|||
const crypto = require('crypto'); |
|||
const {URL} = require('url'); |
|||
const {totp} = require('notp'); |
|||
const base32 = require('thirty-two'); |
|||
|
|||
const generateUri = () => { |
|||
const secret = crypto.randomBytes(32); |
|||
const encodedSecret = base32.encode(secret).toString('utf8').replace(/=/g,''); |
|||
const uri = `otpauth://totp/Umbrel?secret=${encodedSecret}&period=30&digits=6&algorithm=SHA1&issuer=getumbrel.com`; |
|||
|
|||
return uri; |
|||
}; |
|||
|
|||
const verify = (uri, token) => { |
|||
const parsedUri = new URL(uri); |
|||
const secret = base32.decode(parsedUri.searchParams.get('secret')); |
|||
const period = parsedUri.searchParams.get('period'); |
|||
const isValid = totp.verify(token, secret, {window: 6, time: period}); |
|||
|
|||
return Boolean(isValid); |
|||
}; |
|||
|
|||
module.exports = { |
|||
generateUri, |
|||
verify, |
|||
}; |
Loading…
Reference in new issue