websockify/other/js/auth_plugin_examples.js

60 lines
1.7 KiB
JavaScript

/*
* An auth plugin must be a function which returns a function conforing to the
* requirements of the `verifyClients` option on ws.WebSocket.Server.
*
* See: https://github.com/websockets/ws/blob/master/doc/ws.md
*
* If websockify is provided with an --auth-source argument, this will be
* passed to the auth plugin as its first argument.
*
*/
const querystring = require('querystring');
fs = require('fs');
function urlTokenMatch(url, token, verbose=false) {
let splitUrl = url.split("?")
if (splitUrl.length !== 2) {
return ["", false];
}
let qs = splitUrl[1];
let qs_parsed = querystring.parse(qs);
let success = (qs_parsed.token === token);
if (verbose) {
if (!success) {
console.log("Permission denied for token: " + qs_parsed.token);
} else {
console.log("Permission granted for token: " + qs_parsed.token);
}
}
return success;
}
exports.tokenAuth = function tokenAuth(source) {
return function(info) {
let token = source;
return urlTokenMatch(info.req.url, token, true);
}
}
exports.tokenAuthEnv = function tokenAuthEnv(source) {
return function(info) {
let token = process.env[source];
return urlTokenMatch(info.req.url, token, true);
}
}
exports.tokenAuthFile = function tokenEnvFile(source) {
return function(info, cb) {
fs.readFile(source, 'utf8', function(err, data) {
if (err) {
console.log(err);
cb(false);
} else {
let token = data.trim();
let success = urlTokenMatch(info.req.url, token, true);
cb(success);
}
});
}
}