2017-05-26 9 views
-2

Emberでセッションを維持するために、ember-simple-auth & ember-simple-auth-tokenを使用しています。私は、リフレッシュトークンのアプローチを使用したくないのではなく、すべてのサービス要求から応答ヘッダーに新しいjwtトークンを受け取ることを希望します。Ember-simple-authセッションの応答ヘッダーからJWTトークンを更新する方法

サーバーからの応答を受信するたびに、セッション内のjwtトークンを更新してセッションを維持するにはどうすればよいですか?

+0

バックエンドサービスからのすべての応答ヘッダーの一部としてJWTトークンを受信して​​います。このアイデアは、最初に認証中に有効期限を30分に設定してから、バックエンドとのすべての対話で新しいトークンを取得して、adapter-> handelResponseメソッドを使用してセッションで更新しようとしています。一言で言えば、私がやってみたいのは、スライドセッションです。 –

+0

私が直面している問題は、Ember-simple-authがsession.data.authenticated内にトークンと有効期限を保存していることです。これはドキュメントでは読み取り専用と呼ばれています。トークンの更新が許可されていない場合、どのようにしてセッションを有効に保つことができますか? –

答えて

1

これは実行できますが、ember-simple-authember-simple-auth-tokenを拡張する必要があります。あなたのアプローチを使用することはお勧めできませんが、アクセストークンとリフレッシュトークンが望ましい方法です。また、リソースサーバーでトークンの認証と検証を行うだけで、認証機能が必要ないため、スケーラビリティが向上します。また、単一の要求ごとに新しいトークンを生成するためのオーバーヘッドが少し追加されます。

あなたが発見したように、セッションを直接更新することはできませんが、ソースコードに潜んでいると、ember-simple-autheventを使用しますそれを更新する。ただし、このイベントは、authenticatorを上書きまたはカスタマイズする場合にのみ機能します。おそらくember-simple-auth-tokenauthenticators/jwt.jsです。認証者を見ると、update the sessionの例を見ることができます。

したがって、ember-simple-auth-tokenを拡張する独自のカスタムJWTトークン認証プロバイダを作成することをお勧めします。おそらく、sessionを更新する方法を追加するか、新しいアクセストークンを含む未処理の要求ヘッダーを処理する方が良いでしょう。

これが完了したら、選択肢があります。独自のadapterをオーバーライドして、そこから関数を呼び出すか、おそらくember-simple-authdata-adapter-mixin mixinを上書きすることをお勧めします。

ember-simple-authdata-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 
    }); 
} 

バックエンドは明らかにリフレッシュトークンに追加のパラメータを受け入れるように拡張される必要があるであろう承認されていれば、役割を切り替えることができるエンドポイント。

+0

こんにちはマイケル、 貴重なご提案ありがとうございます。トークンをリフレッシュすることについての私の考えは、1)あらかじめ設定されたアイドル時間の後にセッションタイムアウトを持つという2つの要件に基づいていました。 2)特定のユーザーのセットがプロキシに入り、その場でログインユーザーのコンテキストを切り替えることができます。あなたが提案したように、私はこれらのタスクを達成するための他の手段を評価しており、ember-simple-authの基本実装をオーバーライドする必要はありません。これらのアプローチが失敗した場合、最後の手段としてオーセンティケータとミックスインを拡張しようとします。 –

+0

@PrajwalBoloor、更新トークンモデルを使用して要件を達成する方法を示すために私の答えを更新しました。 –

関連する問題