Автоматически или вручную обновлять токен доступа с flask_client в Google App Engine - PullRequest
1 голос
/ 13 апреля 2020

Я успешно могу авторизовать свое приложение у стороннего поставщика OAuth2 (Xero), но не могу обновить sh токен ни автоматически, ни вручную.

В документации предлагается authlib can сделать это автоматически. Я попробовал два различных подхода из документации Authlib: на клиентских документах flask они приводят пример «токена автоматического обновления через сигнал», а на документах веб-клиента они зарегистрируйте функцию «update_token».

При любом подходе никогда не делается попытка обновить sh токен, запрос передается в Xero с токеном с истекшим сроком действия, я получаю сообщение об ошибке и только Чтобы продолжить, нужно вручную повторно авторизовать приложение с помощью Xero.

Вот соответствующий код для метода "update_token" из документации по веб-клиенту:

#this never ends up getting called.
def save_xero_token(name,token,refresh_token=None,access_token=None,tenant_id=None):
    logging.info('Called save xero token.')
    #removed irrelevant code that stores token in NDB here.

cache = Cache()
oauth = OAuth(app,cache=cache)
oauth.register(name='xero',
               client_id = Meta.xero_consumer_client_id,
               client_secret = Meta.xero_consumer_secret,
               access_token_url = 'https://identity.xero.com/connect/token',
               authorize_url = 'https://login.xero.com/identity/connect/authorize',
               fetch_token = fetch_xero_token,
               update_token = save_xero_token,
               client_kwargs={'scope':' '.join(Meta.xero_oauth_scopes)},
              )

xero_tenant_id = 'abcd-123-placeholder-for-stackoverflow'
url = 'https://api.xero.com/api.xro/2.0/Invoices/ABCD-123-PLACEHOLDER-FOR-STACKOVERFLOW'
headers = {'Xero-tenant-id':xero_tenant_id,'Accept':'application/json'}

response = oauth.xero.get(url,headers=headers)    #works fine until token is expired.

Я храню свой токен в следующей модели NDB:

class OAuth2Token(ndb.Model):
    name = ndb.StringProperty()
    token_type = ndb.StringProperty()
    access_token = ndb.StringProperty()
    refresh_token = ndb.StringProperty()
    expires_at = ndb.IntegerProperty()
    xero_tenant_id = ndb.StringProperty()

    def to_token(self):
        return dict(
            access_token=self.access_token,
            token_type=self.token_type,
            refresh_token=self.refresh_token,
            expires_at=self.expires_at
        )

Для полноты, вот как я сохраняю первоначальный ответ от Xero (который отлично работает):

@app.route('/XeroOAuthRedirect')
def xeroOAuthLanding():
    token = oauth.xero.authorize_access_token()
    connections_response = oauth.xero.get('https://api.xero.com/connections')
    connections = connections_response.json()
    for tenant in connections:
        print('saving first org, this app currently supports one xero org only.')
        save_xero_token('xero',token,tenant_id=tenant['tenantId'])

    return 'Authorized application with Xero'

Как я могу получить автомат c обновление для работы, и как я могу вручную инициировать запрос refre sh при использовании клиента flask, если автоматическое c обновление не удается?

1 Ответ

2 голосов
/ 17 апреля 2020

Я считаю, что я нашел здесь проблему, и root это была передача Cache (для временного хранилища учетных данных) при инициализации OAuth:

cache = Cache()
oauth = OAuth(app,cache=cache)

Когда кеш передается , он, кажется, выгружает параметры update_token (и, возможно, fetch_token).

Это должно быть просто:

oauth = OAuth(app)

oauth.register(name='xero',
               client_id = Meta.xero_consumer_client_id,
               client_secret = Meta.xero_consumer_secret,
               access_token_url = 'https://identity.xero.com/connect/token',
               authorize_url = 'https://login.xero.com/identity/connect/authorize',
               fetch_token = fetch_xero_token,
               update_token = save_xero_token,
               client_kwargs={'scope':' '.join(Meta.xero_oauth_scopes)},
              )

кроме того, параметры в моей функции "save_xero_token" необходимо настроить так, чтобы сопоставьте документацию, однако это не относится к исходной проблеме, к которой относится этот вопрос.

...