Guest User

Untitled

a guest
Apr 1st, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var express = require('express')
  2. var bcrypt = require('bcrypt')
  3. var jwt = require('jsonwebtoken')
  4. var randToken = require('rand-token')
  5. const User = require('../model/User')
  6. const BlackListedToken = require('../model/BlackListedToken')
  7. const superAgert = require('superagent')
  8.  
  9. const {
  10.     OAuth2Client
  11. } = require('google-auth-library');
  12.  
  13. const CLIENT_ID = '****'
  14. const FB_APP_TOKEN = '****'
  15. const googleclient = new OAuth2Client(CLIENT_ID);
  16.  
  17. var route = express.Router()
  18. let saltRounds = 8
  19. let jwtSecret = "sample-secret"
  20.  
  21. route.post('/sign_up', (req, res, next) => {
  22.  
  23.     console.log("password - " + req.body.password)
  24.     console.log("user - " + req.body.email)
  25.  
  26.     if (!req.body.password || !req.body.email) {
  27.         return res.status(500).json("Incomplete data")
  28.     }
  29.  
  30.     User.findOne({
  31.         email: req.body.email
  32.     }, function (err, user) {
  33.         if (!err) {
  34.             return res.status(403).json({
  35.                 message: "email is present"
  36.             })
  37.         } else {
  38.  
  39.             var _hashedPassword = bcrypt.hashSync(req.body.password, saltRounds);
  40.  
  41.             var _hashedRequestToken = getHashedRequestToken();
  42.  
  43.             let curDate = Date.now()
  44.             let user = new User({
  45.                 email: req.body.email,
  46.                 hashedPassword: _hashedPassword,
  47.                 createdAt: curDate,
  48.                 updatedAt: curDate,
  49.                 hashedRequestToken: _hashedRequestToken,
  50.                 noOfSessionAllowed: 1
  51.             })
  52.  
  53.             user.save((err, user) => {
  54.                 if (err) {
  55.                     return res.status(500).send(err)
  56.                 } else {
  57.                     var token = getAccessToken(user)
  58.                     res.status(200).send({
  59.                         auth: true,
  60.                         token: token,
  61.                         user: user
  62.                     });
  63.                 }
  64.             })
  65.         }
  66.     })
  67. })
  68.  
  69. route.post('/sign_up_mobile', (req, res, next) => {
  70.     if (!req.body.from || !req.body.email) {
  71.         return res.status(500).json("Incomplete data")
  72.     }
  73.  
  74.     let from = req.body.from
  75.     let accessToken = req.headers['x-access-token']
  76.     // console.log("access token = " + accessToken)
  77.     if (accessToken == null) {
  78.         return res.status(403).json({
  79.             message: "No access token"
  80.         })
  81.     }
  82.     if (from == 'google') {
  83.         //TODO: validate google
  84.         verifyGoogle(accessToken, CLIENT_ID)
  85.             .then(v => {
  86.                 console.log(v)
  87.                 doAfterVerification(req, res, next)
  88.                 // return res.status(200).json("Hurray")
  89.             }).catch(err => {
  90.                 console.log("error - " + err)
  91.                 return res.status(500).json({
  92.                     message: "Unauthorised attempt"
  93.                 })
  94.             })
  95.     } else if (from == 'facebook') {
  96.         //TODO: validate facebook
  97.         verifyFacebook(accessToken, FB_APP_TOKEN)
  98.             .then(result => {
  99.                 console.log(v + ", hurray")
  100.                 return res.status(200).json({
  101.                     message: "Authorised from facebook",
  102.                 })
  103.                 // doAfterVerification(req, res, next)
  104.             }).catch(_error => {
  105.                 return res.status(500).json({
  106.                     message: "Unauthorised from facebook",
  107.                 })
  108.             })
  109.     }
  110. })
  111.  
  112. async function verifyFacebook(clientToken, fbAccessToken) {
  113.     // return new Promise(function (resolve, reject) {
  114.     return new Promise(function (resolve, reject) {
  115.         superAgert.get('https://graph.facebook.com/debug_token')
  116.             // input_token={token-to-inspect}
  117.             // &access_token={app-token-or-admin-token}')
  118.             .query({
  119.                 input_token: clientToken,
  120.                 access_token: fbAccessToken
  121.             })
  122.             .end((err, _result) => {
  123.                 if (err) {
  124.                     console.log(111)
  125.                     console.log(err)
  126.                     reject(err)
  127.                 } else {
  128.                     console.log(222)
  129.                     // console.log(_result)
  130.                     resolve("_result")
  131.                 }
  132.             })
  133.             console.log(333)
  134.     })
  135. }
  136.  
  137. function doAfterVerification(req, res, next) {
  138.     User.findOne({
  139.         email: req.body.email
  140.     }, function (err, user) {
  141.         if (user) {
  142.             //user already exists
  143.             //black list the previous token of this user
  144.             let time = user.updatedAt
  145.             var prevToken = getAccessToken(user)
  146.  
  147.             let blackListedToken = new BlackListedToken({
  148.                 token: prevToken
  149.             })
  150.             blackListedToken.save((err, blackListedToken) => {
  151.                 if (err) {
  152.                     return res.status(500).json({
  153.                         message: "something went wrong"
  154.                     })
  155.                 }
  156.                 user.updatedAt = Date.now()
  157.                 user.hashedRequestToken = getHashedRequestToken()
  158.                 user.save(function (err, _user) {
  159.                     if (err) {
  160.                         return res.status(500).json({
  161.                             message: "unable to create user"
  162.                         })
  163.                     }
  164.  
  165.                     //create new jwt token
  166.                     var newAccessToken = getAccessToken(_user)
  167.  
  168.                     return res.status(200).json({
  169.                         result: {
  170.                             auth: true,
  171.                             token: newAccessToken,
  172.                             user: _user
  173.                         },
  174.                         message: "Old User created"
  175.                     });
  176.                 })
  177.             })
  178.         } else {
  179.             //New user
  180.             createNewUser(req, res, next)
  181.         }
  182.     })
  183. }
  184.  
  185. function createNewUser(req, res, next) {
  186.     let curDate = Date.now()
  187.     let user = new User({
  188.         email: req.body.email,
  189.         createdAt: curDate,
  190.         hashedRequestToken: getHashedRequestToken(),
  191.         updatedAt: curDate,
  192.         noOfSessionAllowed: 1
  193.     })
  194.  
  195.     user.save((err, user) => {
  196.         if (err) {
  197.             return res.status(500).send(err)
  198.         } else {
  199.             var token = getAccessToken(user)
  200.             res.status(200).send({
  201.                 result: {
  202.                     auth: true,
  203.                     token: token,
  204.                     user: user
  205.                 },
  206.                 message: "New user created"
  207.             });
  208.         }
  209.     })
  210. }
  211.  
  212.  
  213. async function verifyGoogle(token, clientId) {
  214.     console.log("totken =" + token + ", client id = " + clientId)
  215.     const ticket = await googleclient.verifyIdToken({
  216.         idToken: token,
  217.         audience: clientId, // Specify the CLIENT_ID of the app that accesses the backend
  218.         // Or, if multiple clients access the backend:
  219.         //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]
  220.     });
  221.     const payload = ticket.getPayload();
  222.     const userid = payload['sub'];
  223.     // If request specified a G Suite domain:
  224.     //const domain = payload['hd'];
  225.     console.log(ticket)
  226. }
  227.  
  228.  
  229. route.post('/sign_in', (req, res, next) => {
  230.     User.findOne({
  231.         email: req.body.email
  232.     }, function (err, user) {
  233.         if (err) {
  234.             return res.status(404).json({
  235.                 message: "user not found"
  236.             })
  237.         }
  238.         bcrypt.hash(req.body.password, saltRounds, function (err, hash) {
  239.             if (err) {
  240.                 return res.status(403).json({
  241.                     message: "pass word does not match"
  242.                 })
  243.             }
  244.             var token = getAccessToken(user)
  245.         });
  246.     })
  247. })
  248.  
  249. route.get('/me', (req, res, next) => {
  250.     var accessToken = req.headers['x-access-token']
  251.     if (!accessToken) {
  252.         return res.status(401).send({
  253.             auth: false,
  254.             message: 'no token provided'
  255.         })
  256.     }
  257.     BlackListedToken.find({
  258.         token: accessToken
  259.     }, function (err, token) {
  260.         if (!err) {
  261.             return res.status(403).send({
  262.                 auth: false,
  263.                 message: 'blacklisted'
  264.             })
  265.         } else {
  266.             jwt.verify(token, "sample-secret", (err, decoded) => {
  267.                 if (err) {
  268.                     return res.status(500).send({
  269.                         auth: false,
  270.                         message: 'Failed to authenticate token.'
  271.                     });
  272.                 }
  273.                 res.status(200).send(decoded);
  274.             })
  275.         }
  276.     })
  277. })
  278.  
  279. function getHashedRequestToken() {
  280.     var randNum = randToken.generate(16);
  281.     var _hashedRequestToken = bcrypt.hashSync(randNum, saltRounds);
  282.     console.log("hashed token = " + _hashedRequestToken)
  283.     return _hashedRequestToken
  284. }
  285.  
  286. function getAccessToken(user) {
  287.     var token = jwt.sign({
  288.         id: user._id,
  289.         updatedAt: user.updatedAt
  290.     }, jwtSecret, {
  291.         expiresIn: 60 // expires in 60 seconds
  292.     });
  293.     return token
  294. }
  295.  
  296. module.exports = route
Add Comment
Please, Sign In to add comment