├── .gitignore ├── README.md ├── config.js ├── controller ├── AuthController.js ├── UserController.js └── requestAuthenticator.js ├── db.js ├── index.js ├── model └── user.js ├── package.json └── routers ├── apiAdapter.js ├── feedService.js ├── hashtagService.js └── router.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Simple API Gateway using Express JS 2 | 3 | The committed `config.js` file just for example. 4 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'secret': 'qweqweqwe' 3 | } -------------------------------------------------------------------------------- /controller/AuthController.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var bodyParser = require('body-parser'); 4 | var User = require('../model/user'); 5 | var jwt = require('jsonwebtoken'); 6 | var bcrypt = require('bcryptjs'); 7 | var config = require('../config'); 8 | 9 | router.use(bodyParser.urlencoded({ extended: false })); 10 | router.use(bodyParser.json()); 11 | 12 | router.post('/register', (req, res) => { 13 | let hashedPassword = bcrypt.hashSync(req.body.password, 8) 14 | console.log(hashedPassword) 15 | User.create({ 16 | name: req.body.name, 17 | email: req.body.email, 18 | password: hashedPassword 19 | }, (err, user) => { 20 | if (err) return res.status(500).send("Registration failed") 21 | 22 | var token = jwt.sign({ id: user._id }, config.secret, { expiresIn: 86400 }) 23 | 24 | res.status(200).send({ auth: true, token: token }) 25 | }) 26 | }) 27 | 28 | router.post('/login', (req, res) => { 29 | User.findOne({ email: req.body.email }, (err, user) => { 30 | if (err) return res.status(500).send("Internal server error") 31 | if (!user) return res.status(404).send("User not found") 32 | 33 | var passwordIsValid = bcrypt.compareSync(req.body.password, user.password) 34 | if (!passwordIsValid) return res.status(401).send({ auth: false, token: null }) 35 | 36 | var token = jwt.sign({ id: user._id }, config.secret, { expiresIn: 86400 }) 37 | 38 | res.status(200).send({ auth: true, token: token }) 39 | }) 40 | }) 41 | 42 | module.exports = router -------------------------------------------------------------------------------- /controller/UserController.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ecojuntak/api-gateway/820b314f2b29221bdd7963c1c8492024156fc722/controller/UserController.js -------------------------------------------------------------------------------- /controller/requestAuthenticator.js: -------------------------------------------------------------------------------- 1 | var jwt = require('jsonwebtoken'); 2 | var config = require('../config') 3 | 4 | module.exports = (req, res, next) => { 5 | if (!req.headers['authorization']) { 6 | res.status(401).send("Unauthorized") 7 | } else { 8 | jwt.verify(req.headers['authorization'], config.secret, (err, decoded) => { 9 | if (err) { 10 | res.status(403).send("Forbidden") 11 | } else { 12 | next() 13 | } 14 | }) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /db.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose') 2 | 3 | mongoose.connect('mongodb://localhost:27017/api-gateway') -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var app = express(); 3 | var router = require('./routers/router') 4 | var bodyParser = require('body-parser'); 5 | var db = require('./db') 6 | 7 | app.use(bodyParser.json()) 8 | app.use(bodyParser.urlencoded({ extended: false })); 9 | 10 | app.get('/', (req, res) => { 11 | res.send("Simple API Gateway") 12 | }) 13 | 14 | app.use(router) 15 | 16 | console.log("Simple API Gateway run on localhost:3000") 17 | 18 | app.listen(3000); 19 | -------------------------------------------------------------------------------- /model/user.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose') 2 | 3 | var UserSchema = new mongoose.Schema({ 4 | name: String, 5 | email: String, 6 | password: String 7 | }) 8 | 9 | mongoose.model('User', UserSchema) 10 | 11 | module.exports = mongoose.model('User') -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api-gateway", 3 | "version": "1.0.0", 4 | "description": "Simple API Gateway using Express JS", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "github.com/ecojuntak/api-gateway" 12 | }, 13 | "keywords": [ 14 | "api-gateway" 15 | ], 16 | "author": "Eko Simanjuntak", 17 | "license": "ISC", 18 | "dependencies": { 19 | "bcryptjs": "^2.4.3", 20 | "express": "^4.16.4", 21 | "jsonwebtoken": "^8.3.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /routers/apiAdapter.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | 3 | module.exports = (baseURL) => { 4 | return axios.create({ 5 | baseURL: baseURL, 6 | }); 7 | } -------------------------------------------------------------------------------- /routers/feedService.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router() 3 | const apiAdapter = require('./apiAdapter') 4 | const isAuthorized = require('../controller/requestAuthenticator') 5 | 6 | const BASE_URL = 'http://localhost:8000' 7 | const api = apiAdapter(BASE_URL) 8 | 9 | router.get('/feeds', isAuthorized, (req, res) => { 10 | api.get(req.path).then(resp => { 11 | res.send(resp.data) 12 | }) 13 | }) 14 | 15 | router.get('/feeds/:hashtag', isAuthorized, (req, res) => { 16 | api.get(req.path).then(resp => { 17 | res.send(resp.data) 18 | }) 19 | }) 20 | 21 | router.post('/feeds', isAuthorized, (req, res) => { 22 | api.post(req.path, req.body).then(resp => { 23 | res.send(resp.data) 24 | }) 25 | }) 26 | 27 | module.exports = router -------------------------------------------------------------------------------- /routers/hashtagService.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router() 3 | const apiAdapter = require('./apiAdapter') 4 | const isAuthorized = require('../controller/requestAuthenticator') 5 | 6 | const BASE_URL = 'http://localhost:8088' 7 | const api = apiAdapter(BASE_URL) 8 | 9 | router.get('/hashtags', isAuthorized, (req, res) => { 10 | api.get(req.path).then(resp => { 11 | res.send(resp.data) 12 | }) 13 | }) 14 | 15 | router.get('/hashtags/:name', isAuthorized, (req, res) => { 16 | api.get(req.path).then(resp => { 17 | res.send(resp.data) 18 | }) 19 | }) 20 | 21 | module.exports = router -------------------------------------------------------------------------------- /routers/router.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router() 3 | var feedRouter = require('./feedService') 4 | var hashtagRouter = require('./hashtagService') 5 | var authRouter = require('../controller/AuthController') 6 | 7 | router.use((req, res, next) => { 8 | console.log("Called: ", req.path) 9 | next() 10 | }) 11 | 12 | router.use(feedRouter) 13 | router.use(hashtagRouter) 14 | router.use(authRouter) 15 | 16 | module.exports = router --------------------------------------------------------------------------------