lintry

增加算法和创建url的方法

......@@ -20,49 +20,52 @@ const Authenticator = function (secret, options) {
const TOTP_OPTIONS = this.totp_options = {
secret: this.secret,
encoding: options.encoding || 'base32',
step: options.step || 30
step: options.step || 30,
algorithm: options.algorithm || 'sha512'
};
/**
* 验证token有效性
* @type {Authenticator.verify}
* @param token
*/
const verify = this.verify = function(token) {
this.verify = function(token) {
return speakeasy.totp.verify(_.merge({token: token}, TOTP_OPTIONS));
};
/**
* 在options.window的范围内验证token的有效性
* @type {Authenticator.verifyDelta}
* @param token
*/
const verifyDelta = this.verifyDelta = function(token) {
this.verifyDelta = function(token) {
return speakeasy.totp.verifyDelta(_.merge({token: token}, TOTP_OPTIONS));
};
/**
* 获取QR显示值
* @type {Authenticator.getOtpAuth}
* @param title
* @param issuer
* @return {string}
*/
const getOtpAuth = this.getOtpAuth = function (title, issuer) {
let _title = title || 'HowAreU';
let _issuer = encodeURIComponent(issuer || 'TOTP-KEY');
return `otpauth://totp/${_title}?secret=${this.secret}&issuer=${_issuer}`;
this.getOtpAuth = function (title, issuer) {
return speakeasy.otpauthURL(_.merge({ label: title, issuer: issuer }, TOTP_OPTIONS));
};
/**
* 生成svg的QR图片内容
* @type {Authenticator.getQR}
* @param title
* @param issuer
* @return {*}
*/
const getQR = this.getQR = function(title, issuer) {
return qr.imageSync(getOtpAuth(title, issuer), { type: 'svg' });
this.getQR = function(title, issuer) {
return qr.imageSync(this.getOtpAuth(title, issuer), { type: 'svg' });
};
/**
* 生成新的token
* @type {Authenticator.totp}
* @return {String}
*/
const totp = this.totp = function () {
this.totp = function () {
return speakeasy.totp(_.merge({}, TOTP_OPTIONS));
};
......
......@@ -16,7 +16,8 @@ const TOTP = function (options) {
const TOTP_OPTIONS = {
encoding: options.encoding || 'base32',
step: options.step || 30
step: options.step || 30,
algorithm: options.algorithm || 'sha512'
};
/**
......
......@@ -8,10 +8,9 @@ const fs = require('fs-extra');
const path = require('path');
let secret = 'vH6OdbUEjSukTqlDvW3TYdusjiOIkxRnAHNTjJewfZa5yNueG9wx1N9pJMFOmPAV';
let authenticator = new Authenticator(secret);
let authenticator = new Authenticator(secret, {algorithm: 'sha512'});
console.log(chalk.cyan('totp的secret'));
console.log(secret);
console.log(secret, authenticator.totp_options);
let token = process.argv[2];
if (!token) {
......
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 51 51"><path d="M1 1h7v7h-7zM10 1h3v1h-1v1h-1v-1h-1zM15 1h1v1h-1zM17 1h1v1h-1zM19 1h1v1h2v-1h1v1h1v1h-2v1h-1v-1h-2v1h1v1h2v-1h3v1h1v-1h1v-1h2v1h-1v6h-1v1h-1v-1h-6v-1h-1v2h2v3h-2v2h-1v3h-1v-1h-2v-1h-1v-2h-1v-1h-1v-1h3v3h1v-3h1v1h1v-1h-1v-1h1v-1h-1v-2h1v-1h1v-2h-1v-4h1zM26 1h4v1h1v1h-2v-1h-3zM31 1h2v1h-2zM34 1h1v1h-1zM36 1h3v1h2v-1h1v3h-1v1h-1v-2h-2v-1h-1v2h-1v-1h-1v-1h1zM43 1h7v7h-7zM2 2v5h5v-5zM16 2h1v2h-1v1h-3v-1h1v-1h2zM25 2h1v2h-1zM44 2v5h5v-5zM3 3h3v3h-3zM9 3h2v2h2v1h-1v3h1v1h-2v-1h-2zM12 3h1v1h-1zM45 3h3v3h-3zM30 4h3v3h-1v-1h-1v1h-1zM34 4h1v1h-1zM37 4h2v2h1v3h-1v-2h-1v1h-1v-1h-1v1h-1v-1h-1v-1h2v-1h1zM10 6v2h1v-2zM14 6h1v1h-1zM16 6h2v2h-1v-1h-1zM20 6v2h1v-2zM22 6v2h1v-2zM24 6v3h3v-3zM13 7h1v1h1v-1h1v1h1v1h-1v3h-1v-1h-1v-1h1v-1h-2zM25 7h1v1h-1zM29 7h1v1h-1zM31 7h1v1h1v2h1v1h-2v2h1v1h1v1h-1v1h1v1h-3v-1h1v-1h-1v-1h-1v-1h1v-2h-1v2h-2v-1h1v-2h3v-1h-2v-1h1zM33 7h1v1h-1zM41 7h1v3h-2v-1h1zM36 8h1v1h-1zM1 9h1v1h1v1h-1v1h1v-1h1v1h1v1h-3v1h-1zM3 9h5v1h-1v1h-1v-1h-3zM37 9h1v1h-1zM43 9h5v1h-3v2h-1v-1h-1zM8 10h2v1h-2zM36 10h1v1h1v1h-1v1h1v-1h1v2h-2v2h-1v-3h-3v-1h1v-1h1v1h1zM38 10h1v1h-1zM7 11h1v1h-1zM11 11h2v1h-1v1h-1zM22 11h3v1h-2v1h2v-1h2v1h-1v1h1v1h-1v1h1v2h-2v1h-1v1h-2v-1h1v-1h1v-1h1v-2h-1v-1h-1v1h-1zM27 11h1v1h-1zM41 11h1v1h-1zM46 11h4v3h-1v1h1v1h-1v3h-1v-1h-1v-1h1v-2h-2v-2h2v-1h-2zM6 12h1v1h-1zM8 12h2v2h-1v-1h-1zM42 12h2v1h1v3h2v1h-3v-2h-2v-1h1v-1h-1zM45 12h1v1h-1zM7 13h1v1h-1zM27 13h1v1h-1zM40 13h1v1h-1zM2 14h3v1h-1v1h-2v1h1v1h1v3h-1v-1h-1v-1h-1v-4h1zM6 14h1v1h1v1h-1v1h1v1h-2v-1h-1v1h-1v-2h1v-1h1zM8 14h1v1h-1zM10 14h2v2h-1v-1h-1zM28 14h2v1h1v1h-2v-1h-1zM20 15h1v1h-1zM34 15h1v1h-1zM38 15h2v2h1v1h-2v1h1v1h-1v1h-1v-2h-1v-1h-1v-1h2zM8 16h2v2h-1v-1h-1zM12 16h1v1h-1zM19 16h1v2h1v6h1v1h1v-2h1v-1h-2v-1h5v1h-1v1h3v2h-1v1h1v1h1v-1h1v-1h1v-1h1v2h-1v3h1v1h-1v1h-1v-1h-1v-1h1v-1h-1v1h-1v1h1v1h-1v2h-2v-1h1v-2h-1v2h-1v2h3v-1h1v1h1v1h-1v1h-1v-1h-3v1h3v1h-2v2h-3v1h-1v-1h-1v-1h3v-1h-1v-1h-1v1h-1v-1h-1v-1h3v-1h1v-2h-1v-1h1v-1h-1v1h-2v3h-1v-1h-1v1h-1v1h-2v1h2v-1h1v1h1v1h-1v1h1v2h-1v-1h-1v2h-1v-2h-2v-1h3v-1h-3v-2h-2v-1h1v-2h-1v1h-1v-1h-2v-1h-1v2h-1v-2h-1v-1h1v-1h-1v-1h-2v3h-1v-2h-1v-1h1v-2h-1v-1h1v-2h-1v-1h1v-2h1v-1h3v2h-1v-1h-1v1h1v1h-1v1h1v-1h1v-1h1v1h1v1h1v2h-1v-1h-1v1h1v1h-1v2h1v-1h1v2h-2v1h2v1h1v-1h2v1h1v-2h2v1h1v-1h1v1h2v-1h-2v-2h1v1h1v-1h1v-1h-3v1h-1v-2h-1v-2h1v1h1v-3h-1v-1h-1v-1h1zM22 16h1v1h-1zM35 16h1v1h-1zM42 16h1v1h1v2h1v1h1v1h-1v2h1v3h1v-1h1v2h-2v1h-1v1h1v1h-4v-1h-1v-1h-1v1h-1v-1h-1v-1h3v-4h1v-1h-1v1h-1v-2h2v-1h1v-1h-1zM28 17h1v1h-1zM10 18h1v1h-1zM13 18h2v1h-1v1h-3v-1h2zM31 18h2v2h-1v3h-3v-1h2v-1h-2v1h-1v-2h-2v-1h3v1h2zM15 19h2v2h1v1h-2v-2h-1zM41 19h1v1h-1zM46 19h1v1h-1zM49 19h1v3h-3v-1h1v-1h1zM1 20h1v2h1v1h1v2h-1v1h1v1h-1v1h-1v-1h-1v-1h1v-3h-1zM10 20h1v1h-1zM14 20h1v1h-1zM33 20h1v1h-1zM35 20h1v2h-1zM11 21h2v1h-2zM37 21h1v1h1v1h-1v1h1v-1h1v2h-1v1h-3v-1h1zM13 22h3v1h-2v1h1v1h-1v1h-2v-1h1zM46 22h1v1h-1zM16 23h1v1h-1zM33 23h1v1h-1zM35 23h1v1h-1zM47 23h1v1h-1zM49 23h1v1h-1zM6 24v3h3v-3zM24 24v3h3v-3zM34 24h1v1h-1zM42 24v3h3v-3zM7 25h1v1h-1zM15 25h3v1h-2v1h-1zM25 25h1v1h-1zM43 25h1v1h-1zM33 26h1v1h1v2h-2zM13 27h1v1h-1zM16 27h1v1h-1zM18 27h1v1h-1zM48 27h2v1h-1v1h-1zM14 28h1v1h-1zM24 28v1h1v-1zM27 28v1h1v-1zM43 28v1h1v-1zM1 29h1v1h-1zM7 29h1v1h-1zM12 29h1v1h-1zM37 29h2v1h-1v2h-1zM40 29h1v1h1v1h-2zM47 29h1v1h-1zM49 29h1v1h-1zM2 30h1v1h1v1h-1v2h-1zM34 30h1v1h1v1h-1v1h-3v-1h2zM46 30h1v1h3v2h-2v-1h-1v1h1v1h-1v2h-4v-2h1v-1h2zM7 31h1v1h-1zM18 31v2h-1v-1h-1v2h2v-1h1v-1h2v-1zM39 31h1v1h-1zM42 31h3v1h-3zM4 32h3v1h1v1h-1v1h1v-1h1v1h2v1h-2v1h1v2h1v2h-2v1h-2v-1h1v-1h1v-1h-1v-1h-1v1h1v1h-2v-1h-1v-2h3v-1h-2v-1h-2zM23 32h1v2h-1zM30 32h1v1h-1zM10 33h3v3h1v1h1v1h-1v1h2v1h-3v-1h-2v-1h1v-1h-1v-1h1v-1h-1v-1h-1zM35 33h3v1h1v1h-1v1h-1v1h-1v-2h1v-1h-2zM39 33h3v3h-1v-1h-1v-1h-1zM32 34h1v1h-1zM45 34v1h1v-1zM1 35h1v1h-1zM31 35h1v1h-1zM34 35h1v1h-1zM39 35h1v2h2v-1h1v1h5v1h-1v1h1v-1h2v2h-4v-2h-1v3h3v1h-1v1h-1v4h-1v2h-2v-1h1v-1h-1v-1h-1v1h-2v-1h1v-1h-1v-1h1v-1h-1v-2h3v-1h-1v-1h2v-1h-3v2h-2v1h-1v1h-3v1h-1v-2h2v-1h2v-1h-1v-2h1v-1h1zM49 35h1v2h-2v-1h1zM3 36h1v1h-1zM30 36h1v1h-1zM32 36h2v1h-2zM1 37h2v1h-1v1h-1zM31 37h1v1h1v2h-1v-1h-2v-1h1zM34 37h1v1h-1zM28 38h1v1h1v1h-2zM39 38v1h1v-1zM2 39h1v1h2v1h-1v1h-3v-1h1zM35 39h1v1h-1zM22 40h1v1h-1zM24 40h2v1h1v-1h1v2h1v1h-1v1h2v-1h1v1h1v1h1v1h-1v1h-1v-1h-1v-1h-2v2h1v1h-1v1h-3v-1h-2v2h-7v-1h1v-1h1v1h4v-3h1v1h3v1h1v-1h-1v-1h-3v-1h-2v1h-2v-1h-1v1h1v1h2v1h-3v-1h-1v-1h-1v-1h1v-1h1v-1h2v-1h1v1h2v-2h1zM31 40h1v1h1v1h-1v1h-1v-1h-1v-1h1zM13 41h3v2h-2v-1h-1zM19 41h1v1h-1zM21 41h1v1h-1zM49 41h1v1h-1zM9 42h1v1h-1zM11 42h2v1h-2zM24 42v3h3v-3zM38 42h1v4h-1v1h2v2h-1v-1h-2v1h2v1h-3v-1h-1v1h-1v-3h1v1h1v-1h1v-1h-1v-2h1v1h1zM42 42v3h3v-3zM48 42h1v1h1v1h-1v2h-2v-1h1v-1h-1v-1h1zM1 43h7v7h-7zM10 43h1v1h1v1h-1v1h-1v2h-1v-4h1zM25 43h1v1h-1zM32 43h1v1h-1zM35 43h1v1h-1zM43 43h1v1h-1zM2 44v5h5v-5zM14 44h2v1h-1v1h-1zM3 45h3v3h-3zM12 45h1v1h-1zM49 46h1v1h-1zM13 47h1v2h1v1h-2v-1h-1v-1h1zM15 47h1v1h-1zM30 47h1v1h-1zM10 48h1v1h1v1h-3v-1h1zM31 48h1v1h1v1h-3v-1h1zM49 48h1v2h-2v-1h1zM24 49h1v1h-1zM28 49h1v1h-1zM40 49h1v1h-1zM42 49h1v1h-1zM46 49h1v1h-1z"/></svg>
\ No newline at end of file
......@@ -6,7 +6,8 @@ const TOTP = require('../lib/totp');
const chalk = require('chalk');
const fs = require('fs-extra');
let totp = new TOTP();
let algorithm = process.argv[2] || 'sha512';
let totp = new TOTP({algorithm: algorithm});
let secret = totp.createSecret();
console.log(chalk.cyan('创建totp的secret'));
......