Ember 在适配器中承诺感知 headers

Ember promise aware headers in Adapter

正在寻找一种方法来使用异步调用返回的值在 Ember ADAPTER LATER 中设置 header。

尝试从 Amplify 的 Auth.currentSession() 中设置 idToken 返回值,这是一个承诺函数,在到期时内部处理刷新令牌。

类似这样的等待响应 -

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

.

.

我发现我们无法为 header 计算 属性 的承诺。

我也不是在寻找使用 ember-simple-auth / ember-cognito 或任何其他插件的解决方案, 我需要使用普通的放大库和 Ember 适配器 header 来实现这一点。

一个可能的解决方案是覆盖适配器的 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);
    }
});

较新版本(当前为 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}`
    }
  }
}