Передача объекта между запросами flask, в частности, intuit-oauth AuthClient

#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, но эта проблема решена.