1 | require('dotenv').config(); |
||
2 | var https = require('https'); |
||
3 | var express = require('express'); |
||
4 | var session = require('express-session'); |
||
5 | var request = require('request'); |
||
6 | var app = express(); |
||
7 | var config = require('./config.json'); |
||
8 | var path = require('path'); |
||
9 | var crypto = require('crypto'); |
||
10 | var QuickBooks = require('node-quickbooks'); |
||
11 | var queryString = require('query-string'); |
||
12 | var fs = require('fs'); |
||
13 | var json2csv = require('json2csv'); |
||
14 | var Tokens = require('csrf'); |
||
15 | var csrf = new Tokens(); |
||
16 | var atob = require('atob'); |
||
17 | |||
18 | // Configure View and Handlebars |
||
19 | app.use(express.static(path.join(__dirname, ''))) |
||
20 | app.set('views', path.join(__dirname, 'views')) |
||
21 | var exphbs = require('express-handlebars'); |
||
22 | var hbs = exphbs.create({}); |
||
23 | app.engine('handlebars', hbs.engine); |
||
24 | app.set('view engine', 'handlebars'); |
||
25 | app.use(session({secret: 'secret', resave: 'false', saveUninitialized: 'false'})) |
||
26 | |||
27 | /* |
||
28 | Create body parsers for application/json and application/x-www-form-urlencoded |
||
29 | */ |
||
30 | var bodyParser = require('body-parser') |
||
31 | app.use(bodyParser.json()) |
||
32 | var urlencodedParser = bodyParser.urlencoded({ extended: false }) |
||
33 | |||
34 | /* |
||
35 | App Variables |
||
36 | */ |
||
37 | var oauth2_token_json=null, |
||
38 | openIDConnect_token_json=null, |
||
39 | realmId = '', |
||
40 | accessToken = '', |
||
41 | payload = ''; |
||
42 | var fields = ['realmId', 'name', 'id', 'operation', 'lastUpdated']; |
||
43 | var newLine= "\r\n"; |
||
44 | |||
45 | |||
46 | app.use(express.static('views')); |
||
47 | |||
48 | app.get('/', function(req, res) { |
||
49 | |||
50 | // Render home page with params |
||
51 | res.render('index', { |
||
52 | redirect_uri: config.redirectUri, |
||
53 | oauth2_token_json: oauth2_token_json, |
||
54 | webhook_uri: config.webhookUri, |
||
55 | webhook_payload: payload, |
||
56 | openIDConnect_token_json: openIDConnect_token_json |
||
57 | }); |
||
58 | }); |
||
59 | |||
60 | app.get('/authUri', function(req,res) { |
||
61 | |||
62 | console.log("The passed config object is :"+ (req.query.openIDConnect)); |
||
0 ignored issues
–
show
Debugging Code
introduced
by
![]() |
|||
63 | |||
64 | |||
65 | /* |
||
66 | Generate csrf Anti Forgery |
||
67 | */ |
||
68 | req.session.secret = csrf.secretSync(); |
||
69 | var state = csrf.create(req.session.secret); |
||
70 | |||
71 | /* |
||
72 | Generate the AuthUrl |
||
73 | */ |
||
74 | var scope; |
||
75 | if(req.query.openIDConnect === 'true') { |
||
76 | console.log(true); |
||
77 | scope = config.scopes.sign_in_with_intuit[0]+' '+config.scopes.sign_in_with_intuit[1]+' '+config.scopes.sign_in_with_intuit[2]+' '+config.scopes.sign_in_with_intuit[3]+' '+config.scopes.sign_in_with_intuit[4]; |
||
78 | } |
||
79 | else { |
||
80 | console.log(false); |
||
81 | scope = config.scopes.connect_to_quickbooks[0]+' '+config.scopes.connect_to_quickbooks[1]; |
||
82 | } |
||
83 | |||
84 | var redirecturl = config.authorization_endpoint + '?' + queryString.stringify({ |
||
85 | |||
86 | 'client_id': config.clientId, |
||
87 | 'redirect_uri': config.redirectUri, //Make sure this path matches entry in application dashboard |
||
88 | 'scope': scope, |
||
89 | 'response_type': 'code', |
||
90 | 'state': state |
||
91 | |||
92 | }); |
||
93 | |||
94 | console.log("The redirectURI is :"+redirecturl); |
||
95 | res.send(redirecturl); |
||
96 | |||
97 | }); |
||
98 | |||
99 | app.get('/callback', function(req, res) { |
||
100 | |||
101 | var parsedUri = queryString.parse(req.originalUrl); |
||
102 | |||
103 | console.log("The parsedURI is :"+ JSON.stringify(parsedUri)); |
||
0 ignored issues
–
show
|
|||
104 | realmId = parsedUri.realmId; |
||
105 | |||
106 | var auth = (new Buffer(config.clientId + ':' + config.clientSecret).toString('base64')); |
||
107 | var postBody = { |
||
108 | url: config.token_endpoint, |
||
109 | headers: { |
||
110 | Accept: 'application/json', |
||
111 | 'Content-Type': 'application/x-www-form-urlencoded', |
||
112 | Authorization: 'Basic ' + auth, |
||
113 | }, |
||
114 | form: { |
||
115 | grant_type: 'authorization_code', |
||
116 | code: req.query.code, |
||
117 | redirect_uri: config.redirectUri |
||
118 | } |
||
119 | }; |
||
120 | |||
121 | request.post(postBody, function (err, res, data) { |
||
122 | accessToken = JSON.parse(res.body); |
||
123 | if(realmId) { |
||
124 | oauth2_token_json = JSON.stringify(accessToken, null,2); |
||
125 | openIDConnect_token_json = null; |
||
126 | } |
||
127 | else { |
||
128 | openIDConnect_token_json = JSON.stringify(accessToken, null,2); |
||
129 | oauth2_token_json = null; |
||
130 | |||
131 | // Decode ID Token |
||
132 | var token_parts = accessToken.id_token.split('.') |
||
133 | var idTokenHeader = JSON.parse(atob(token_parts[0])); |
||
0 ignored issues
–
show
|
|||
134 | var idTokenPayload = JSON.parse(atob(token_parts[1])); |
||
135 | |||
136 | console.log("The realmID is :"+ JSON.stringify(idTokenPayload, 2, null)); |
||
0 ignored issues
–
show
|
|||
137 | |||
138 | // realmId = idTokenPayload.realmid; |
||
139 | } |
||
140 | }); |
||
141 | res.send(''); |
||
142 | |||
143 | }); |
||
144 | |||
145 | app.get('/getCompanyInfo', function(req,res){ |
||
146 | |||
147 | // var token = JSON.parse(token_json); |
||
148 | |||
149 | // save the access token somewhere on behalf of the logged in user |
||
150 | var qbo = new QuickBooks(config.clientId, |
||
151 | config.clientSecret, |
||
152 | accessToken.access_token, /* oAuth access token */ |
||
153 | false, /* no token secret for oAuth 2.0 */ |
||
154 | realmId, |
||
155 | true, /* use a sandbox account */ |
||
156 | true, /* turn debugging on */ |
||
157 | 4, /* minor version */ |
||
158 | '2.0', /* oauth version */ |
||
159 | accessToken.refresh_token /* refresh token */); |
||
160 | |||
161 | qbo.getCompanyInfo(realmId, function(err, companyInfo) { |
||
162 | if (err) { |
||
163 | console.log(err); |
||
164 | res.send(err); |
||
165 | } |
||
166 | else { |
||
167 | console.log("The response is :" + JSON.stringify(companyInfo,null,2)); |
||
168 | res.send(companyInfo); |
||
169 | } |
||
170 | |||
171 | }); |
||
172 | }); |
||
173 | |||
174 | |||
175 | // Start server on HTTP (will use ngrok for HTTPS forwarding) |
||
176 | app.listen(3000, function () { |
||
177 | console.log('Example app listening on port 3000!') |
||
178 | }) |
||
179 |