From cec4c90a463d6315171216fe9c30741951a5c177 Mon Sep 17 00:00:00 2001 From: Nikita Bhambhani Date: Tue, 7 May 2019 09:35:51 -0700 Subject: [PATCH 1/4] Removing OAuth1 support Removing OAuth1 support since new apps use OAuth2 only. This fixes issues #5 and #6 --- .gitignore | 10 +++++++ README.md | 8 ++---- app.py | 73 +++++++++--------------------------------------- config.py | 17 +---------- requirements.txt | 2 +- 5 files changed, 28 insertions(+), 82 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b6ccb3d --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +.env +.flaskenv +*.pyc +*.pyo +env/ +env* +dist/ +.cache/ +.pytest_cache/ diff --git a/README.md b/README.md index 2f8c451..6681cc2 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This sample app is meant to provide working example of how to make API calls to Quickbooks. Specifically, this sample application demonstrates the following: -- Implementing OAuth to connect an application to a customer's QuickBooks Online company for both OAuth1 and OAuth2. +- OAuth2 sample app for a QuickBooks Online company. - Creating a QB customer that are added from Excel file using Customer API. - Gets company data using CompanyInfo API @@ -16,13 +16,11 @@ Please note that while these examples work, features not called out above are no 2. A [developer.intuit.com](https://developer.intuit.com/) account 3. An app on [developer.intuit.com](https://developer.intuit.com/) and the associated app keys: - Client Id and Client Secret for OAuth2 apps; Configure the RedirectUri[http://localhost:5000/callback] in your app's Keys tab on the Intuit developer account, only Accounting scope needed - - Consumer key and Consumer secret for OAuth1 apps -4. This sample app uses several libraries listed in [requirements.txt](requirements.txt) which need to be installed including flask, flask_oauth, openpyxl, requests_oauthlib +4. This sample app uses several libraries listed in [requirements.txt](requirements.txt) which need to be installed including flask, openpyxl, requests_oauthlib ## First Time Instructions 1. Clone the GitHub repo to your computer -2. Install libraries mentioned above in Requirements 4. -3. Fill in your [config.py](config.py) file values by copying over from the keys section for your app +2. Fill in your [config.py](config.py) file values by copying over from the keys section for your app ## Running the code 1. cd to the project directory diff --git a/app.py b/app.py index d77a8b7..aab00bf 100644 --- a/app.py +++ b/app.py @@ -1,5 +1,5 @@ from flask import Flask, request, redirect, url_for, session, g, flash, render_template -from flask_oauth import OAuth +# from flask_oauth import OAuth import requests import urllib from werkzeug.exceptions import BadRequest @@ -16,18 +16,6 @@ app.debug = DEBUG app.secret_key = SECRET_KEY -if config.AUTH_TYPE == 'OAuth1': - oauth = OAuth() - - qbo = oauth.remote_app('qbo', - base_url=config.OAUTH1_BASE, - request_token_url=config.REQUEST_TOKEN_URL, - access_token_url=config.ACCESS_TOKEN_URL, - authorize_url=config.AUTHORIZE_URL, - consumer_key=config.CONSUMER_KEY, - consumer_secret=config.CONSUMER_SECRET - ) - @app.route('/') def index(): """Index route""" @@ -43,11 +31,8 @@ def index(): def update_table(): """Update Excel file after customer is added in QBO""" customer_id = request.form['id'] - - if config.AUTH_TYPE == 'OAuth1': - request_context = context.RequestContextOAuth1(session['realm_id'], session['access_token'], session['access_secret']) - else: - request_context = context.RequestContext(session['realm_id'], session['access_token'], session['refresh_token']) + + request_context = context.RequestContext(session['realm_id'], session['access_token'], session['refresh_token']) for customer in customer_list: if customer['Id'] == customer_id: @@ -73,10 +58,7 @@ def update_table(): @app.route('/company-info') def company_info(): """Gets CompanyInfo of the connected QBO account""" - if config.AUTH_TYPE == 'OAuth1': - request_context = context.RequestContextOAuth1(session['realm_id'], session['access_token'], session['access_secret']) - else: - request_context = context.RequestContext(session['realm_id'], session['access_token'], session['refresh_token']) + request_context = context.RequestContext(session['realm_id'], session['access_token'], session['refresh_token']) response = get_companyInfo(request_context) if (response.status_code == 200): @@ -94,23 +76,18 @@ def company_info(): title='QB Customer Leads', ) - @app.route('/auth') def auth(): """Initiates the Authorization flow after getting the right config value""" - if config.AUTH_TYPE == "OAuth1": - return qbo.authorize(callback=url_for('oauth_authorized')) - else: - # OAuth2 initiate authorization flow - params = { - 'scope': 'com.intuit.quickbooks.accounting', - 'redirect_uri': config.REDIRECT_URI, - 'response_type': 'code', - 'client_id': config.CLIENT_ID, - 'state': csrf_token() - } - url = OAuth2Helper.get_discovery_doc()['authorization_endpoint'] + '?' + urllib.parse.urlencode(params) - return redirect(url) + params = { + 'scope': 'com.intuit.quickbooks.accounting', + 'redirect_uri': config.REDIRECT_URI, + 'response_type': 'code', + 'client_id': config.CLIENT_ID, + 'state': csrf_token() + } + url = OAuth2Helper.get_discovery_doc()['authorization_endpoint'] + '?' + urllib.parse.urlencode(params) + return redirect(url) @app.route('/reset-session') def reset_session(): @@ -147,30 +124,6 @@ def callback(): return redirect(url_for('index')) -if config.AUTH_TYPE == 'OAuth1': - @app.route('/oauth-authorized') - @qbo.authorized_handler - def oauth_authorized(resp): - """Handles callback for OAuth1 only""" - realm_id = str(request.args.get('realmId')) - next_url = url_for('index') - if resp is None: - flash(u'You denied the request to sign in.') - return redirect(next_url) - - session['is_authorized'] = True - session['access_token'] = resp['oauth_token'] - session['realm_id'] = realm_id - session['access_secret'] = resp['oauth_token_secret'] - - return redirect(url_for('index')) - -if config.AUTH_TYPE == 'OAuth1': - @qbo.tokengetter - def get_qbo_token(token=None): - """Get OAuth1 QBO token""" - return session.get('qbo_token') - def csrf_token(): token = session.get('csrfToken', None) if token is None: diff --git a/config.py b/config.py index 7a81d57..698f365 100644 --- a/config.py +++ b/config.py @@ -1,26 +1,11 @@ DEBUG = False SQLALCHEMY_ECHO = False -# Specify which OAuth your app uses; default is OAuth2 -# Change this flag to 1 for OAUth1 apps -AUTH_TYPE = 'OAuth2' -# AUTH_TYPE = 'OAuth1' - -# OAuth2 +# OAuth2 credentials CLIENT_ID= 'EnterClientIDHere' CLIENT_SECRET = 'EnterClientSecretHere' REDIRECT_URI = 'http://localhost:5000/callback' -# OAuth1 -CONSUMER_KEY = 'EnterConsumerKeyHere' -CONSUMER_SECRET = 'EnterConsumerSecretHere' - -# OAuth1 Base URLs -OAUTH1_BASE = 'https://oauth.intuit.com' -REQUEST_TOKEN_URL = 'https://oauth.intuit.com/oauth/v1/get_request_token' -ACCESS_TOKEN_URL = 'https://oauth.intuit.com/oauth/v1/get_access_token' -AUTHORIZE_URL = 'https://appcenter.intuit.com/Connect/Begin' - # Choose environment; default is sandbox ENVIRONMENT = 'Sandbox' # ENVIRONMENT = 'Production' diff --git a/requirements.txt b/requirements.txt index 73855e6..3073da3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ requests==2.13.0 Flask==0.12 -Flask_OAuth==0.13 +# Flask_OAuth==0.12 Werkzeug==0.11.15 openpyxl==2.4.4 requests_oauthlib==0.8.0 From aaed53cd46074785ac7bc26325529fe8a3d5afd3 Mon Sep 17 00:00:00 2001 From: rkasaraneni20 <50219363+rkasaraneni20@users.noreply.github.com> Date: Thu, 29 Jul 2021 21:55:44 -0700 Subject: [PATCH 2/4] Delete Sample.png --- views/Sample.png | Bin 15683 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 views/Sample.png diff --git a/views/Sample.png b/views/Sample.png deleted file mode 100644 index 46a5c53fee2267e5da8a239c3419ec285951733c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15683 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 Date: Thu, 29 Jul 2021 21:56:00 -0700 Subject: [PATCH 3/4] Uploaded survey files --- views/Ratesample.png | Bin 0 -> 2623 bytes views/Thumbdown.png | Bin 0 -> 978 bytes views/Thumbup.png | Bin 0 -> 839 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 views/Ratesample.png create mode 100644 views/Thumbdown.png create mode 100644 views/Thumbup.png diff --git a/views/Ratesample.png b/views/Ratesample.png new file mode 100644 index 0000000000000000000000000000000000000000..17fb7fd12616f7c2cc18cf7541da4b30d27f8f70 GIT binary patch literal 2623 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 hHZ(s$>Q!W{{V+Q;j;h$ literal 0 HcmV?d00001 diff --git a/views/Thumbdown.png b/views/Thumbdown.png new file mode 100644 index 0000000000000000000000000000000000000000..726971ad9dde5a5d2aef7012235ba811f7e2d512 GIT binary patch literal 978 zcmV;@11`yoftIfsxuCqjAJ7^JGe8$j_C*_?E;u4O&Vyr0i|7lrF4L{ zSnTz_mmGOeO1by$uKMnM5+W$5pZDkY=bfTeUR8CH99`G0A8p*eNF)+nZ8ZKNweXkW zSL%NHOq0p&FrfY1mtGi5@9wDi{sW|6Z;%fNY;Mxi$P?U+`$8CO1-J0wv2TPi%fL6n z7D`xll(6h5VcAi_vZI7$M+wW05|$k$EIUeAc9gK}_)a)L4pJx-s8lM^U@)-tx?nI! z@pzoh&(A3w4pXsMq>I>>@18&M>bm%hA!18MWO)Sh&LkE2NbBj-yLD8jaF@M@Sg5Y`%12NxO}Z z@M7+DGuSu|6YD0Qq>`poKd5 z^z`(P=c5x!r_*Z-V!(Oe7RJd0BDLMdAICOm1JUEMc^iYr%3@#+4-c1q59EB_G$^!( zv)Sydhh264vxmcN5usL1R zG}mN-W2ct?Dl2QX+T3II6yt^w#!`1n7I>D2*}c9vI9|4x-U%~pB%8k278A?a?FPg% z;eipDEO0Pq;dP7Yned2-;%r1`g}rDoJrlNq6hIoo4SClp8-W-7w4>LSR)NaQI&;Rp zWmA;J?(QzRji)obs{BO2LiOf0p3N|T5SHz=acQQ(Eahl4W_&H_YW}tG#Xo9U;Oe3J z3jo4e@w!+IX1`DF6Tf07*qoM6N<$f`$Ib AS^xk5 literal 0 HcmV?d00001 diff --git a/views/Thumbup.png b/views/Thumbup.png new file mode 100644 index 0000000000000000000000000000000000000000..b42beb69d676c38aa3b8313e8e95dbf7c05ff690 GIT binary patch literal 839 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5M}!3HE z9OUlAu0^h6!ZBi40T3seyYKUH7`bA->@*nlLS;gBbb+)S;pHZK?r@Vd5@4Rn@ zn{P~f`CXp9N``OZ-GA?$IqMg)JGbmqK6FPg@m+^OxyuY|r8BaE&-yrupKG@ssj*vL zxBva$kQ5_HEfKDJf?^AEKIWK7uL@f&e{cQOEcN&79v0Cy9dCC2PJ0q7)b-(;M53$N z?4^FoozJFCPTDx5{B427g%qQO1{|q8>#t?sJ+|X080u_eSVw@XT?q*cx>) zZ~NuvD?_}thqnC9oo*p+mfEP9<7Ow|3=WqJVPi_mFF_HcE-+xaowM-X1;$5i5bJK0{$NO7j^p@ZLxAAV? z_LnjjGp2MMT{L~k4ZosmhXf8ydQ@L<^o>NMi*IAjsW~%*I$2`5>+Tm=e3`Z(Z@afy z#PVrVy;`^3e(O5lce(MGKX)pN_g;Tp$@Hvyr^xA&EB{_!si_k9b>gn?x)Yca5Typv7 z$BH*PzC23OlV$tQbE(aGS+eSUZt%t3g74(hOE$NdJnzch!JT;J^r{|~j}?bz|I7vQ zHXrG6Q96FMneDw^?W!YtrtR+Ba40@0?(}l;V?Sc|?0NAy`ud~Y9R(AlS^ZiAMOZdU zXXc6A&~xWnerQHc!1G5pB%-%oPw0z3b76bgONXM&&kL`)nTT{4l^Opr{b>2&(3vid zOw_TRb_c18Vjm;+Bg?%0zRM7VO#f7?G_fAiZ4{bxvcD7Wr^T;g0{x@Yio L^>bP0l+XkKuRDf6 literal 0 HcmV?d00001 From 1710efe79cff0d71128837ea04d7418d86c6d04e Mon Sep 17 00:00:00 2001 From: rkasaraneni20 <50219363+rkasaraneni20@users.noreply.github.com> Date: Thu, 29 Jul 2021 21:56:51 -0700 Subject: [PATCH 4/4] Updated survey links --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6681cc2..9ab7409 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Sample Banner](views/Sample.png)][ss1] +[![Rate your Sample](views/Ratesample.png)][ss1][![Yes](views/Thumbup.png)][ss2][![No](views/Thumbdown.png)][ss3] # Data import from Excel to QBO #### Sample App in Python that implements Connect to Quickbooks button and imports customer data from Excel to QBO company. @@ -41,4 +41,6 @@ Please note that while these examples work, features not called out above are no #### Note: For other OAuth2 services like Refresh token, Revoke token, etc, refer to [this](https://github.com/IntuitDeveloper/OAuth2PythonSampleApp) app -[ss1]: https://help.developer.intuit.com/s/samplefeedback?cid=9010&repoName=SampleApp-QuickBooksV3API-Python +[ss1]: # +[ss2]: https://customersurveys.intuit.com/jfe/form/SV_9LWgJBcyy3NAwHc?check=Yes&checkpoint=SampleApp-QuickBooksV3API-Python&pageUrl=github +[ss3]: https://customersurveys.intuit.com/jfe/form/SV_9LWgJBcyy3NAwHc?check=No&checkpoint=SampleApp-QuickBooksV3API-Python&pageUrl=github