JSFiddle - React, Tailwind, and code Playground
by Luke
JavaScript
var fs = require('fs');
var koa = require('koa');
var app = koa();
var requestBody = require('koa-body');
var serve = require('koa-static');
var Router = require('koa-router');
var jwt = require('koa-jwt');
var publicRouter = new Router();
var apiRouter = new Router();
// Public Routes and Middleware. unprotected
// Custom 401 handling if you don't want to expose koa-jwt errors to users
app.use(function *(next){
try {
yield next;
} catch (err) {
// 401 Unauthorized. this error is thrown when authorization fails. here, when jwt token not exixsts or invalid.
if (401 == err.status) {
this.redirect('/enter');
} else if (404 == err.status) {
this.status = 404;
} else {
throw err;
}
}
});
app.use(serve('browser/dist'));
app.use(requestBody());
var readFileThunk = function(src) {
return new Promise(function (resolve, reject) {
fs.readFile(src, {'encoding': 'utf8'}, function (err, data) {
if(err) return reject(err);
resolve(data);
});
});
}
publicRouter.get('/',/* jwt({secret: 'my secret'}),*/ function* (next){
var token = this.request.body.Authorization;
console.log("token", token);
jwt.verify(token, 'my secret', function(err, decoded){
if(err) {
console.log("route '/'", err);
} else {
console.log("route '/'", decoded);
this.body = readFileThunk(__dirname + '/browser/dist/app.html');
}
})
});
publicRouter.get('/jwt', function* (next){
var token = jwt.sign({ foo: 'bar' }, 'my secret');
console.log(token);
this.response.headers.Authorization = token;
console.log("route /jwt", this.response.headers);
this.body = token;
this.redirect('/');
});
publicRouter.get('/enter', function* (next){
// if jwt related auth hader exists then redirect to '/'
// else if not serve enter.html file.
this.body = yield readFileThunk(__dirname + '/browser/dist/enter.html');
});
app
.use(publicRouter.routes())
.use(publicRouter.allowedMethods());
app.listen(3000);
console.log('listening on port...