Source: controller/garmingAuth.js

"use strict";
// Dependencies
const request = require("request");
const OAuth = require("oauth-1.0a");
const crypto = require("crypto");
const eatmyride = require("../database/eatMyRideDB");
const Activity = require("../model/activities");
let config = require("../../config.json");

/**
 * Step 1: Get Request token
 *
 * @param  {} req 
 * @param  {} res - Response
 */
exports.requestToken = function(req, res) {
  // Configure request
  const oauth = OAuth({ 
    consumer: {
      key: config.garmin.key,         // geef van garmin de key mee 
      secret: config.garmin.secret    // geef van garmin de secret mee
    },
    signature_method: "HMAC-SHA1",    // Encrypty door HMAC-SHA1
    hash_function(base_string, key) { 
      return crypto
        .createHmac("sha1", key)
        .update(base_string)
        .digest("base64");            
    }
  });

  const request_data = {
    url: config.url.requestToken,
    method: "POST"
  };

  request(
    {
      url: request_data.url,
      method: request_data.method,
      headers: oauth.toHeader(oauth.authorize(request_data))
    },
    function(error, response, body) {
      res.send(response);
    }
  );
};

/**
 * Step 2: Get user access token
 *
 * @param  {} req - Oauth token, Oauth verifier and Oauth secret
 * @param  {} res - Response
 */
exports.retrieveAccessToken = function(req, res) {
  let oauth_token = req.body.token;
  let oauth_secret = req.body.secret;
  let oauth_verifier = req.body.verifier;

  // Initialize
  const oauth = OAuth({
    consumer: {
      key: config.garmin.key,
      secret: config.garmin.secret
    },
    signature_method: "HMAC-SHA1",
    hash_function(base_string, key) {
      return crypto
        .createHmac("sha1", key)
        .update(base_string)
        .digest("base64");
    }
  });

  const request_data = {
    url: config.url.accessToken,
    method: "POST",
    data: {
      oauth_verifier: oauth_verifier
    }
  };

  var token = {
    key: oauth_token,
    secret: oauth_secret
  };

  request(
    {
      url: config.url.accessToken,
      method: request_data.method,
      headers: oauth.toHeader(oauth.authorize(request_data, token))
    },

    function(err, response, body) {
      // save
      try {
        let body_to_token_and_secret = splitBody(body);
        eatmyride.saveUser(
          body_to_token_and_secret[0],
          body_to_token_and_secret[1]
        );

        Activity.getHistoricDataAfterLogin(body_to_token_and_secret[0], body_to_token_and_secret[1], 1);
      
      } catch (err) {
        console.log(
          "The body does not contain the data token and secret \n",
          err
        );
      }
      res.send(response);
    }
  );
};

/**
 * Split the body to strings we can work with
 *
 * @return array with the token and secret. If fail empty string
 */
var splitBody = function(body) {
  // oauth_token=3795b466-6595-449c-a73b-7c1ce5200291&oauth_token_secret=cPbEW166uOYVEYBjPnSIA8Vx8ethtoqv1qb
  try {
    let splittedBody = body.split("&");
    return [
      splittedBody[0].split("=")[1].replace(/\s+/g, ''), // oauth_token=3795b466-6595-449c-a73b-7c1ce520029
      splittedBody[1].split("=")[1].replace(/\s+/g, '') //  oauth_token_secret=cPbEW166uOYVEYBjPnSIA8Vx8ethtoqv1qb
    ];
  } catch (error) {
    console.log(error);
    return "";
  }
};