Заголовки с учетом обещаний Ember в адаптере

Ищете способ установить заголовок в Ember ADAPTER LATER со значением, возвращаемым из асинхронного вызова.

Попытка установить returend idToken из Auth.currentSession() от Amplify, которая является функцией обещания, которая внутренне обрабатывает обновление токена по истечении срока действия.

Что-то вроде этого, чтобы дождаться ответа -

headers: computed(async function() {
        return {
          'Authorization': await Auth.currentSession().getIdToken();
        };
      })

.

.

Я вижу, что мы не можем сделать вычисляемое свойство, учитывающее обещание, также для заголовков.

Также я не ищу решения с использованием ember-simple-auth / ember -ognito или каких-либо других дополнений, мне нужно добиться этого только с помощью простой библиотеки усиления и заголовка адаптеров Ember ????.


person Dilipan    schedule 16.06.2020    source источник
comment
Это то, что вы ищете? guides.emberjs.com/release/models/customizing-adapters/ создание отслеживаемого геттера заголовка   -  person Gokul Kathirvel    schedule 16.06.2020
comment
Спасибо за предложение @GokulKathirvel ✌️. Свойства с отслеживанием надежды - это новый способ вычисления свойств, поскольку мы все еще находимся в версии 2.15v и не знакомы с аннотациями. Хотя, я думаю, должно быть такое же поведение. . . Я мог бы пойти с вашим решением, если значение, которое должно быть установлено в заголовках, будет обновляться через интервал внутри службы, и я могу вычислить / отслеживать значение заголовков на основе этого атрибута службы. Но для меня сценарий таков: всякий раз, когда вызываются заголовки в адаптерах, только в этот момент я буду делать асинхронный вызов, чтобы получить значение и установить его в заголовках.   -  person Dilipan    schedule 16.06.2020
comment
Я не пользуюсь Ember Data. Однако вам нужно будет получить доступ к заголовку для каждого запроса к серверу, верно? Если да, можете ли вы сделать асинхронный вызов getIdToken заранее? однако доступ к этому асинхронному вызову по каждому запросу кажется лишним.   -  person Gokul Kathirvel    schedule 16.06.2020
comment
Он должен вызываться асинхронно каждый раз, чтобы получить действительный idToken (если истек срок получения нового idToken с refreshToken в руке, что в любом случае является поведением библиотеки Amplify). Прямо сейчас да, вот как это делается, как ты сказал. Перед выполнением вызова через Ember Data токен будет заранее собран и установлен через adapterFor или snapshot.adapter.option на уровне маршрутов / компонентов. Но мне нужно реорганизовать их все и переместить в одно место внутри самого слоя адаптера ????.   -  person Dilipan    schedule 16.06.2020


Ответы (2)


Возможное решение - переопределить метод ajax адаптера.

import DS from 'ember-data';

export default DS.RESTAdapter.extend({
    async ajax(...args) {
        // Store the parent call, so it can be called after getting the current session.
        const _super = this._super.bind(this);

        // Sorry, I'm unfamiliar with how you're accessing amplify
        const headers = await amplify.currentSession();

        this.set('headers', {
            'Authentication': headers.auth
        });

        return _super(...args);
    }
});
person Garrick Cheung    schedule 18.06.2020
comment
Пробовал это, и, похоже, он работает именно так, как мне нужно. Сделал несколько настроек, чтобы сначала получить фактические атрибуты заголовков адаптера, а затем установить другой асинхронный поверх него внутри ajax. Большое спасибо, чувак ????, просто великолепно !! - person Dilipan; 18.06.2020

Решение для более новых версий (в настоящее время 3.21)

export default class ApplicationAdapter extends RESTAdapter {
  @inject auth //my own auth service

  ajax(...args) {
    return new Promise((resolve, reject) => {
      this._getHeaders().then((headers) => {
        this.set('headers', headers);
        super.ajax(...args).then(resolve, reject);
      });
    })
  }

  async _getHeaders() {
    const token = await this.auth.token();
    return {
      'Authorization': `Bearer ${token}`
    }
  }
}

person user3529458    schedule 11.09.2020
comment
Пожалуйста, дайте также некоторые пояснения, а не только код. - person Peter Csala; 11.09.2020