#python #flask #session #quickbooks-online
#питон #flask #сессия #quickbooks-онлайн
Вопрос:
Я пытаюсь написать приложение flask для интеграции с quickbooks online api, и у меня возникли проблемы с аутентификацией. Следуя их руководству по python, я собрал приведенный ниже код. В настоящее время моя проблема заключается в том, что я не могу понять, как передавать объект AuthClient между запросами. Я предположил, что могу просто использовать сеансы flask, но объект AuthClient при вызове из сеансов является неполным, он содержит только оболочку и ни один из заполненных данных, насколько я могу судить.
Нужно ли мне пытаться создать подкласс AuthClient и переписать методы, используемые для травления? Если да, то любые подсказки о том, как начать работу, были бы очень полезны.
Кроме того, если у кого-то есть какой-либо опыт интеграции с quickbooks, советы по этому поводу были бы полезны.
from flask import Flask, session, redirect, request
from flask_session import Session
from intuitlib.client import AuthClient
from intuitlib.enums import Scopes
import os
import requests
SECRET_KEY = 'something'
DEBUG = True
REDIS_URL = 'redis://10.74.10.235:6379/0'
app = Flask(__name__)
app.debug = DEBUG
app.secret_key = SECRET_KEY
app.config['SESSION_TYPE'] = 'filesystem'
app.config['SECRET_KEY'] = SECRET_KEY
app.config['REDIS_URL'] = REDIS_URL
sess = Session()
sess.init_app(app)
@app.route('/auth')
def auth():
client_id = os.environ['CLIENT_ID']
client_secret = os.environ['CLIENT_SECRET']
redirect_uri = os.environ['REDIRECT_URI']
environment = os.environ['ENVIRONMENT']
auth_client = AuthClient(client_id, client_secret, redirect_uri, environment)
url = auth_client.get_authorization_url([Scopes.ACCOUNTING])
session['auth_client'] = auth_client
return redirect(url)
@app.route('/callback')
def callback():
auth_client = session['auth_client']
state = str(request.args.get('state'))
auth_code = str(request.args.get('auth_code'))
realm_id = str(request.args.get('realm_id'))
auth_client.get_bearer_token(auth_code, realm_id=realm_id)
return 'boobs'
if __name__ == '__main__':
app.run()
Ответ №1:
Ну, я пытался сохранить неправильную информацию. Нашел пример приложения, которое фактически использовало модуль intuitlib здесь . https://github.com/IntuitDeveloper/SampleOAuth2_UsingPythonClient/blob/master/app/views.py
Оказывается, вместо того, чтобы передавать AuthClient, вы воссоздаете его каждый раз, предоставляя ему дополнительные аргументы по мере их получения, такие как:
auth_client = AuthClient(
settings.client_id,
settings.client_secret,
settings.redirect_uri,
settings.environment,
access_token=session.get('access_token', None),
refresh_token=session.get('refresh_token', None),
id_token=session.get('id_token', None),
)
Сохранение только токенов в сеансе.
Все еще возникают некоторые проблемы с получением токена-носителя и ошибкой 400, но эта проблема решена.