-
Notifications
You must be signed in to change notification settings - Fork 3
/
one-time-passcode-client.js
53 lines (50 loc) · 1.8 KB
/
one-time-passcode-client.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
* To be used :
* - https://github.com/markbao/speakeasy
* - otpauth://totp/Example:[email protected]?secret=JBSWY3DPEHPK3PXP&issuer=Example
* - install npm module:
* > sudo npm install qrcode -g
* > npm install speakeasy
* - Create with:
* > var qrcode = require('qrcode');
* > var speakeasy = require('speakeasy');
* >
* > var key = speakeasy.generate_key( {length : 20} );
* > var otpURL = "otpauth://totp/marvin.morea.fr:[email protected]?secret=" + key.base32 + "&issuer=marvin.morea.fr"
* > qrcode.toDataURL( otpURL, function(qrcode ) {
* console.log( qrcode );
* });
* // http://stackoverflow.com/questions/21944544/what-data-do-i-have-to-use-to-generate-a-qr-code-for-google-authenticator
* - Check with :
* > speakeasy.totp({key: key.base32, encoding: 'base32'});
*/
// subscrib
Meteor.subscribe("userOTP");
if (typeof MeteorOTP === "undefined")
MeteorOTP = {};
/**
* Call a callback if OTP is ok
* callAfterOTPCheck(yourFunction, arg1, arg2, ...)
*
* /!\ if called client side, be aware that this is easy to bypass.
*
* You need to call it client side for best user XP
* AND made an other OTP check server side for security concerning critical actions
*/
MeteorOTP.callAfterOTPCheck = function (callback) {
try {
if (MeteorOTP.checkOTPExpiration(Meteor.user())) {
Meteor.call('checkOTP', prompt("Merci de taper un code OTP"), function (err, res) {
if (res) // only set a result if OTP is ok
callback(null, res);
else
callback(Meteor.Error(401, "OneTimePassCode error: OTP incorrect !"));
});
return;
}
} catch (err) {
callback(new Meteor.Error(501, "OneTimePassCode error: you don't have OTP activated on your user account"));
}
// run the callback: OTP is not expired
callback(null, true);
}