これは実行できますが、ember-simple-auth
とember-simple-auth-token
を拡張する必要があります。あなたのアプローチを使用することはお勧めできませんが、アクセストークンとリフレッシュトークンが望ましい方法です。また、リソースサーバーでトークンの認証と検証を行うだけで、認証機能が必要ないため、スケーラビリティが向上します。また、単一の要求ごとに新しいトークンを生成するためのオーバーヘッドが少し追加されます。
あなたが発見したように、セッションを直接更新することはできませんが、ソースコードに潜んでいると、ember-simple-auth
はeventを使用しますそれを更新する。ただし、このイベントは、authenticator
を上書きまたはカスタマイズする場合にのみ機能します。おそらくember-simple-auth-token
のauthenticators/jwt.js
です。認証者を見ると、update the sessionの例を見ることができます。
したがって、ember-simple-auth-token
を拡張する独自のカスタムJWTトークン認証プロバイダを作成することをお勧めします。おそらく、session
を更新する方法を追加するか、新しいアクセストークンを含む未処理の要求ヘッダーを処理する方が良いでしょう。
これが完了したら、選択肢があります。独自のadapter
をオーバーライドして、そこから関数を呼び出すか、おそらくember-simple-auth
のdata-adapter-mixin
mixinを上書きすることをお勧めします。
ember-simple-auth
data-adapter-mixin
を上書きすると、これが最適な開始点と思われます。handleResponse
その関数をオーバーライドする場合は、更新セッション関数を呼び出すことができる生のAPIレスポンスにアクセスする必要があります。
ご覧のとおり、これは簡単な変更ではありません。これらの図書館がもともと計画していたものとはまったく異なりますが、良い仕事をするならば、可能でなければなりません。 OPさんのコメント
ため
更新が前に、私は実際にこれらの要件の両方を実装:1)事前に設定したアイドル時間後にセッションタイムアウトを持っている」2)でプロキシへのユーザーの特定のセットを許可するとのコンテキストを切り替えますログインユーザーはその場で "。リフレッシュ・トークン・モデルで実現するのはかなり簡単です。
#1をサポートするには、ログアウト前のアイドル時間の長さにリフレッシュトークンの有効期限を設定する必要があります。例えばリフレッシュトークンが30分で期限切れに設定され、アクセストークンが5分で失効する場合クライアントは、余裕に基づいて、新しいアクセストークン(およびオプションでリフレッシュトークン)を〜5分ごとに自動的にフェッチします。ただし、ユーザーがページを30分以上放置すると、更新トークンが失効し、再認証が必要になります。
#2の場合、残念ながらember-simple-auth-token
のオーバーライドが少しありますが、これは比較的簡単で既に実装済みのものです。基本的には、更新されたコンテキスト/状態の新しいトークンを交換しトークンにアクセスするための追加機能を持つカスタム認証ツールを作成します。
ember-simple-auth-token
オーバーライドされたオーセンティケータ:以下の私の実装を参照してください。トークン交換をトリガする
/**
Provides a public method to call to exchange an access token for an
updated access token with updated data encoded in it. This method
essentially asks the backend to update an access token with different
values. This is, at the moment, is only used to switch the company root
attribute in the token (AKA switch companies for admins).
@param {string} token - The valid access token
@param {object} [headers] - An optional object which can add additional
headers to the request
@param {object} additionalData - An object which contains the data which should be updated on the token. It should look something like this:
```
{
company_root_id: '<UUID of a valid company root>'
}
```
@return {Promise} A promise which is the request. It will either resolve
with the updated session data or reject with the error.
*/
exchangeAccessToken(token, headers, additionalData) {
const data = this.makeRefreshData(token);
Ember.merge(data, additionalData);
return new Ember.RSVP.Promise((resolve, reject) => {
this.makeRequest(this.serverTokenRefreshEndpoint, data, headers).then(response => {
Ember.run(() => {
try {
const sessionData = this.handleAuthResponse(response);
this.trigger('sessionDataUpdated', sessionData);
resolve(sessionData);
} catch(error) {
reject(error);
}
});
}, (xhr, status, error) => {
Ember.Logger.warn(`Access token could not be refreshed - server responded with ${error}.`);
reject();
});
});
}
処置:
switchCompany(companyId) {
let session = this.get('_session.session');
if(!this.get('isAdministrator')) {
throw new Error('Logged in user is not an administrator, they cannot switch companies.');
}
let token = session.get('authenticated.access_token');
let appInstance = Ember.getOwner(this);
let authorizerName = session.get('authenticator');
let authorizer = appInstance.lookup(authorizerName);
if(!authorizer) {
throw new Error(`Authorizer (${authorizerName}) does not exist`);
}
if(typeof authorizer.exchangeAccessToken !== 'function') {
throw new Error(`Authorizer (${authorizerName}) does not have an \`exchangeAccessToken\` method.`);
}
return authorizer.exchangeAccessToken(token, null, {
company_root_id: companyId
});
}
バックエンドは明らかにリフレッシュトークンに追加のパラメータを受け入れるように拡張される必要があるであろう承認されていれば、役割を切り替えることができるエンドポイント。
バックエンドサービスからのすべての応答ヘッダーの一部としてJWTトークンを受信しています。このアイデアは、最初に認証中に有効期限を30分に設定してから、バックエンドとのすべての対話で新しいトークンを取得して、adapter-> handelResponseメソッドを使用してセッションで更新しようとしています。一言で言えば、私がやってみたいのは、スライドセッションです。 –
私が直面している問題は、Ember-simple-authがsession.data.authenticated内にトークンと有効期限を保存していることです。これはドキュメントでは読み取り専用と呼ばれています。トークンの更新が許可されていない場合、どのようにしてセッションを有効に保つことができますか? –