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}`
}
}
}
正在寻找一种方法来使用异步调用返回的值在 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}`
}
}
}