RADIUS node for Node-RED

node-red-contrib-node-radius

This is a first version of rough RADIUS nodes for node-red, aimed at providing raw RADIUS protocol access in Node-RED. This gives the possibility to implement RADIUS authentication and accounting within Node-RED.

This project still contains rough code and is in it's early days, so please don't hesitate to report any issues on github.

Example workflow

Example authentication and accounting flows.

[
  {
    "id": "78558f05.470e6",
    "type": "radius-request",
    "z": "2c4088be.642158",
    "server": "6bc2abc.e010054",
    "name": "",
    "x": 140,
    "y": 680,
    "wires": [["b0bdae77.f3723", "7791e9b4.ed9048"]]
  },
  {
    "id": "272fb8a7.54a368",
    "type": "radius-response",
    "z": "2c4088be.642158",
    "server": "6bc2abc.e010054",
    "name": "",
    "x": 520,
    "y": 680,
    "wires": []
  },
  {
    "id": "b0bdae77.f3723",
    "type": "function",
    "z": "2c4088be.642158",
    "name": "Authenticate",
    "func": "if(msg.topic != 'Access-Request')\n return;\n \nvar username = msg.payload.attributes['User-Name'];\nvar password = msg.payload.attributes['User-Password'];\n\nvar users = [\n {username: 'niklas', password:'monkey123', groups: 'users, adults, topsecret'},\n {username: 'linda', password:'monkey123', groups: 'users, adults'},\n {username: 'vilmer', password:'summer123', groups: 'users, children'},\n {username: 'ellie', password:'summer123', groups: 'users, children'},\n {username: 'elicia', password:'summer123', groups: 'users, children'},\n ];\n\n\nvar authenticated = users.some((user) => {\n if(user.username.toLowerCase() == username.toLowerCase() && user.password == password) {\n msg.payload.code = 'Access-Accept';\n msg.payload.attributes = [\n // ['Session-Timeout', 600],\n ['Idle-Timeout', 3600],\n ['Vendor-Specific', 5089, [[1, user.groups]]]\n ];\n\n node.status({fill:\"green\",shape:\"dot\",text:user.username + ' authenticated.'}); \n node.send(msg);\n return true;\n }\n return false;\n});\n\nif(!authenticated) {\n msg.payload.code = 'Access-Reject';\n msg.payload.attributes = [];\n this.status({fill:\"red\",shape:\"ring\",text: username + \" failed auth\"});\n \n return msg;\n}\n",
    "outputs": 1,
    "noerr": 0,
    "x": 330,
    "y": 640,
    "wires": [["272fb8a7.54a368"]]
  },
  {
    "id": "7791e9b4.ed9048",
    "type": "function",
    "z": "2c4088be.642158",
    "name": "Accounting",
    "func": "if(msg.topic != 'Accounting-Request')\n return;\n \n\nmsg.payload.code = 'Accounting-Response';\nmsg.payload.attributes = [];\n\nreturn [msg, null];",
    "outputs": 2,
    "noerr": 0,
    "x": 330,
    "y": 700,
    "wires": [["272fb8a7.54a368"], []]
  },
  {
    "id": "6bc2abc.e010054",
    "type": "radius-server",
    "z": "",
    "port": "1812",
    "secret": "topsecret"
  }
]
2019-04-10