crm-api-template-generator/backend/utils/oauth2.js

85 lines
2.5 KiB
JavaScript

const qs = require('qs')
const axios = require('axios')
const findProperty = require('./findProperty')
const CRM = require('../models/CRM')
const { set, get, del } = require('./redisClient')
const get75PercentTimeInSeconds = require('./get75PercentTimeInSeconds')
const exchangeForTokens = async (crmOauth, exchangeProof) => {
const { request, body, response } = findProperty(crmOauth.crm.crmRest, 'tokenEndpoint')
let { requestContentType, requestEncoding, requestType, responseType, url } = request
let config = {
method: requestType,
url,
data: qs.stringify(exchangeProof)
}
if (requestContentType != 'none') {
config = {
...config, headers: {
'Content-Type': requestContentType
}
}
}
console.log('CONFIG: ', config)
const { data } = await axios(config)
const { refresh_token, access_token, token_type, expires_in, issued_at } = data
console.log('===========> refresh_token: ', refresh_token)
console.log('===========> access_token: ', access_token)
// salesforce case
if (issued_at)
await set(crmOauth.crm.authentication.crmClientId, access_token, get75PercentTimeInSeconds(issued_at))
else
await set(crmOauth.crm.authentication.crmClientId, access_token, Math.round(expires_in * 0.75))
crmOauth = await CRM.findOne({ 'crm.authentication.crmClientId': crmOauth.crm.authentication.crmClientId })
if (refresh_token) {
crmOauth.crm.authentication.crmOAuthRefreshToken = refresh_token
}
crmOauth.crm.authentication.crmOAuthToken = access_token
await crmOauth.save()
return access_token
}
const refreshAccessToken = async (clientId) => {
let crmOauth = await CRM.findOne({ 'crm.authentication.crmClientId': clientId })
crmOauth = crmOauth.toObject()
const refreshTokenProof = {
grant_type: 'refresh_token',
client_id: crmOauth.crm.authentication.crmClientId,
client_secret: crmOauth.crm.authentication.crmClientSecret,
redirect_uri: process.env.URL_OAUTH_CALLBACK,
refresh_token: crmOauth.crm.authentication.crmOAuthRefreshToken
}
return await exchangeForTokens(crmOauth, refreshTokenProof)
}
const getAccessToken = async (clientId) => {
if (!await get(clientId)) {
console.log('Refreshing expired access token')
await refreshAccessToken(clientId)
}
return await get(clientId)
}
module.exports = {
exchangeForTokens,
refreshAccessToken,
getAccessToken
}