Newer
Older
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// finally, let's run a tiny webserver for the example code.
const
express = require('express'),
path = require('path'),
urlparse = require('urlparse'),
postprocess = require('postprocess'),
querystring = require('querystring'),
sessions = require('connect-cookie-session'),
jwcrypto = require("jwcrypto");
// alg
require("jwcrypto/lib/algs/rs");
Lloyd Hilaiel
committed
require("jwcrypto/lib/algs/ds");
var exampleServer = express.createServer();
exampleServer.use(express.cookieParser());
exampleServer.use(function(req, res, next) {
if (/^\/api/.test(req.url)) {
return sessions({
secret: "this secret, isn't very secret",
key: 'example_browserid_primary',
cookie: {
path: '/api',
httpOnly: true,
secure: false,
maxAge: 1 * 60 * 60 * 1000
}
})(req, res, next);
} else {
next();
}
});
exampleServer.use(express.logger({ format: 'dev' }));
Lloyd Hilaiel
committed
if (process.env['PUBLIC_URL']) {
var burl = urlparse(process.env['PUBLIC_URL']).validate().normalize().originOnly().toString();
console.log('using browserid server at ' + burl);
Lloyd Hilaiel
committed
exampleServer.use(postprocess(function(req, buffer) {
Lloyd Hilaiel
committed
return buffer.toString().replace(new RegExp('https://login.persona.org', 'g'), burl);
}));
}
exampleServer.use(express.static(path.join(__dirname, "..", "example", "primary")));
exampleServer.use(express.bodyParser());
Lloyd Hilaiel
committed
const API_PREFIX = '/api/';
exampleServer.use(function(req, resp, next) {
if (req.url.substr(0, API_PREFIX.length) === API_PREFIX) {
resp.setHeader('Cache-Control', 'no-store, max-age=0');
}
next();
});
exampleServer.get("/api/whoami", function (req, res) {
if (req.session && typeof req.session.user === 'string') return res.json(req.session.user);
return res.json(null);
});
exampleServer.get("/api/login", function (req, res) {
req.session = {user: req.query.user};
return res.json(null);
});
exampleServer.get("/api/logout", function (req, res) {
req.session = {};
return res.json(null);
});
var _privKey = jwcrypto.loadSecretKey(
require('fs').readFileSync(
path.join(__dirname, '..', 'example', 'primary', 'sample.privatekey')));
exampleServer.post("/api/cert_key", function (req, res) {
var user = req.session.user;
var domain = process.env['SHIMMED_DOMAIN'];
var expiration = new Date();
var pubkey = jwcrypto.loadPublicKeyFromObject(req.body.pubkey);
expiration.setTime(new Date().valueOf() + req.body.duration * 1000);
jwcrypto.cert.sign({publicKey: pubkey, principal: {email: user + "@" + domain}},
{issuer: domain, expiresAt: expiration, issuedAt: new Date()},
{}, _privKey, function(err, cert) {
res.json({ cert: cert });
});
exampleServer.listen(
process.env['PORT'] || 10001,
process.env['HOST'] || process.env['IP_ADDRESS'] || "127.0.0.1",
function() {
var addy = exampleServer.address();
console.log("running on http://" + addy.address + ":" + addy.port);
});