working new account

This commit is contained in:
AJ ONeal 2018-06-06 10:58:01 +00:00
parent 2b2a0021aa
commit 2b9fadf4b4
2 changed files with 81 additions and 58 deletions

View File

@ -7,31 +7,28 @@ curl -s --user 'api:YOUR_API_KEY' \
-F subject='Hello' \ -F subject='Hello' \
-F text='Testing some Mailgun awesomeness!' -F text='Testing some Mailgun awesomeness!'
*/ */
var _auths = module.exports._auths = {};
module.exports.authenticate = function (opts) { module.exports.authenticate = function (opts) {
console.log("It's auth'n time!");
var util = require('util'); var util = require('util');
var requestAsync = util.promisify(require('request')); var requestAsync = util.promisify(require('request'));
var state = opts.state; var state = opts.state;
var jwtoken = opts.auth; var jwtoken = opts.auth;
var auth;
var mailer = { var mailer = {
user: 'wizard@telebit.cloud' user: 'wizard@telebit.cloud'
, secret: 'fbbf21d73c9d2f480bd0e71f5f18494e' , secret: 'fbbf21d73c9d2f480bd0e71f5f18494e'
}; };
var crypto = require('crypto'); var crypto = require('crypto');
if (!state._auths) {
state._auths = {};
}
if ('{' === jwtoken) { console.log('[DEBUG] ext auth', jwtoken);
try { auth = jwtoken;
auth = JSON.parse(auth); if ('object' === typeof auth && /^.+@.+\..+$/.test(auth.subject)) {
} catch(e) { console.log('parsed');
auth = null;
}
if (auth && /^.+@.+\..+$.test(auth.subject)) {
var id = crypto.randomBytes(16).toString('hex'); var id = crypto.randomBytes(16).toString('hex');
state._auths[id] = {}; console.log("[DEBUG] gonna send email");
return requestAsync({ return requestAsync({
url: 'https://api.mailgun.net/v3/YOUR_DOMAIN_NAME/messages' url: 'https://api.mailgun.net/v3/telebit.cloud/messages'
, method: 'POST' , method: 'POST'
, auth: { user: 'api', pass: 'key-70ef48178081df19783ecfbe6fed5e9a' } , auth: { user: 'api', pass: 'key-70ef48178081df19783ecfbe6fed5e9a' }
, formData: { , formData: {
@ -43,20 +40,23 @@ module.exports.authenticate = function (opts) {
+ "The login request came from '" + auth.hostname + "'\n " + "The login request came from '" + auth.hostname + "'\n "
+ "(" + auth.os_arch + " " + auth.os_platform + " " + auth.os_release + ")\n" + "(" + auth.os_arch + " " + auth.os_platform + " " + auth.os_release + ")\n"
} }
}).then(function () { }).then(function (resp) {
console.log("[DEBUG] email was sent, or so they say"); console.log("[DEBUG] email was sent, or so they say");
console.log(resp.body);
return new state.Promise(function (resolve, reject) { return new state.Promise(function (resolve, reject) {
// TODO use global interval whenever the number of active links is high // TODO use global interval whenever the number of active links is high
var t = setTimeout(function () { var t = setTimeout(function () {
delete state._auths[id]; console.log("the moon lady wins :-/");
delete _auths[id];
var err = new Error("Login Failure: Magic Link was not clicked within 5 minutes"); var err = new Error("Login Failure: Magic Link was not clicked within 5 minutes");
err.code = 'E_LOGIN_TIMEOUT'; err.code = 'E_LOGIN_TIMEOUT';
reject(); reject();
}, 300 * 1000); }, 300 * 1000);
function authorize() { function authorize() {
console.log("mighty auth'n ranger!");
clearTimeout(t); clearTimeout(t);
delete state._auths[id]; delete _auths[id];
var hri = require('human-readable-ids').hri; var hri = require('human-readable-ids').hri;
var hrname = hri.random() + '.telebit.cloud'; var hrname = hri.random() + '.telebit.cloud';
var jwt = require('jsonwebtoken'); var jwt = require('jsonwebtoken');
@ -66,22 +66,24 @@ module.exports.authenticate = function (opts) {
, aud: 'telebit.cloud' , aud: 'telebit.cloud'
, iss: Math.round(Date.now() / 1000) , iss: Math.round(Date.now() / 1000)
, id: id , id: id
, hostname: auth.hostname
}; };
tokenData.jwt = jwt.sign(tokenData, state.secret); tokenData.jwt = jwt.sign(tokenData, state.secret);
resolve(tokenData); resolve(tokenData);
return tokenData;
} }
state._auths[id] = { _auths[id] = {
fn: authorize dt: Date.now()
, dt: Date.now() , resolve: authorize
, reject: reject , reject: reject
}; };
}); });
}); });
} }
}
console.log("just trying a normal token...");
try { try {
decoded = jwt.decode(jwtoken, { complete: true }); decoded = jwt.decode(jwtoken, { complete: true });
} catch(e) { } catch(e) {
@ -90,3 +92,22 @@ module.exports.authenticate = function (opts) {
return state.defaults.authenticate(opts.auth); return state.defaults.authenticate(opts.auth);
}; };
var express = require('express');
var app = express();
app.use('/login', function (req, res) {
var tokenData;
var magic = req.query.magic;
if (_auths[magic]) {
tokenData = _auths[magic].resolve();
res.send("<h1>Your device is authorized for the following:</h1><pre><code>" + JSON.stringify(tokenData, null, 2) + "</code></pre>");
} else {
res.send("<h1>Invalid Magic Link</h1>"
+ "<pre><code>'" + magic + "' isn't a valid link.\nLinks are only good for 5 minutes, so act fast.\n"
+ "(" + new Date(1000*((_auths[magic]||{}).dt||0)).toISOString() + ")</code></pre>\n"
);
}
});
module.exports.webadmin = function (state, req, res) {
console.log('[DEBUG] extensions webadmin');
app(req, res);
};

View File

@ -39,6 +39,7 @@
"dependencies": { "dependencies": {
"bluebird": "^3.5.1", "bluebird": "^3.5.1",
"cluster-store": "^2.0.8", "cluster-store": "^2.0.8",
"express": "^4.16.3",
"finalhandler": "^1.1.1", "finalhandler": "^1.1.1",
"greenlock": "^2.2.4", "greenlock": "^2.2.4",
"human-readable-ids": "^1.0.4", "human-readable-ids": "^1.0.4",
@ -47,6 +48,7 @@
"proxy-packer": "^1.4.3", "proxy-packer": "^1.4.3",
"recase": "^1.0.4", "recase": "^1.0.4",
"redirect-https": "^1.1.5", "redirect-https": "^1.1.5",
"request": "^2.87.0",
"serve-static": "^1.13.2", "serve-static": "^1.13.2",
"sni": "^1.0.0", "sni": "^1.0.0",
"ws": "^5.1.1" "ws": "^5.1.1"