2017-02-07 24 views
6

私はreact + reduxを使用してウェブサイトを作成しようとしています。 私はすでにサーバーにjwt認証をセットアップしました。 私がしたいのは、コンポーネント/コンテナとレデューサーの一部を遅延ロードして、認証されたユーザーだけがダウンロードできるようにすることです。私はすでに、認証されていないユーザー(クライアント側)からコンポーネントを隠す方法を知っていますが、相対的なJavaScriptコードをダウンロードしないようにしたいと考えています。レスキューレックスで認証が必要なレイジーロードコンポーネント

私はwebpackを使用していますが、すでに反応ルータとrequire-ensurehttps://stackoverflow.com/a/33044701/2920112)を調べましたが、この方法では認証がまったく処理されないようです。 何らかの形でfetchを使用することも考えましたが(おそらくwebpackとプライベートコードを別々にバンドルしています)、取り込んだバンドルをどうすればいいのか分かりません。

私は間違った方法で問題に近づいていますか? 私が見る唯一の代替案は、パブリックコンテンツのみを含むWebpackバンドルをロードするHTMLファイルとプライベートコードをダウンロードするHTMLファイルの2つを提供することです。しかしこれは本当に最適ではないようです。 正しいアプローチは何ですか?

+0

私はあなたが 'require-sure'を使うことができると信じています。あなた自身の認証ロジックを含める必要があります。ユーザ認証は 'require.ensure()'で呼び出すものと 'cb'コールバックに渡すコンポーネントを変更します。 – Lucas

+0

あなたは解決策を見つけましたか?私も同様の問題に直面しています。すべてのアセットは保護されており、要求ヘッダーにトークンが必要です。 require.insureがバックグラウンドで何かをハイジャックする方法を知らないので、次のチャンクをダウンロードするときにトークンを送信します。 –

答えて

0

我々は反応するルータを使用してこれを解決:

<Route 
    key="secured_component" 
    path="/secured" 
    onEnter={handleEnterSecuredComponent} 
    getComponent=({nextState, cb) => { 
     require.ensure([],() => { 
      cb(null, require('YourComponent').default); 
     }); 
    }} 
/> 
... 
const handleEnterSecuredComponent = (nextState, replace) => { 
    const {login: {success}} = store.getState(); 
    if (!success) { 
     replace('/login'); 
    } 
}; 

をだからあなたのログインページが再来{ログイン真}:{成功}に設定する必要があり、ユーザーが認証された場合。 認証されたユーザーが/ secureにアクセスしようとすると、彼は/ loginにリダイレクトされます。

require.ensureは認証の役割を果たしません。 webpackがjsファイルのチャンクを分割して遅延ロードするためのエントリポイントです。

+0

私はすでに(反応ルータで)何か似たようなことをやっていますが、認証されていないユーザーが望むなら、合理的なjavascriptコードを読み込むことを妨げません。 webpackが 'require.ensure'によって作成したチャンクのURLに手作業でGETリクエストを提出した場合、ダウンロードを阻止する承認メカニズムはありません。 – lgpasquale

+0

@lgpasquale:フロントエンドのJavascriptには合理的なコードが含まれてはいけません...クライアントを信頼しないでください!実装するすべての「実際の」セキュリティー・メカニズムは、サーバー側でなければなりません。他のすべてはUXのためのものです。 – sclausen

関連する問題