2017-08-27 7 views
4

ログインしたユーザーのみがホームページとタスクページにアクセスできるようにするにはどうすればよいですか?私はreduxを使用しています。私はauthについてより良く学ぶために事前に作られた認証コンポーネントを避けようとしています。レスポンスのミドルウェアとしての認証コンポーネント

const App = props => (
    <BrowserRouter> 
     <Provider store={store}> 
      <div className="app"> 
       <Layout> 
       <Header> 
        <Navbar /> 
       </Header> 
       <Content> 
        <Route exact path='/' component={Home} /> 
        <Route exact path='/login' component={Login} /> 
        <Route exact path='/signup' component={Signup} /> 
        <Route exact path='/task/:id' component={Task} /> 
       </Content> 
       </Layout> 
      </div> 
     </Provider> 
    </BrowserRouter> 
) 

私は角度を使用していましたが、ルートにミドルウェアの概念がありましたが、反応すると私は迷子になりました。 authはreduxの店とは関係ないと思いますか?ユーザーがアプリをナビゲートするときにAPIからユーザー詳細を取得するために呼び出す必要がありますか?

答えて

0

この問題を解決するために、上位コンポーネントを使用してルートアプリケーションルートをラップして使用しました。私たちのルート構造はちょっと違っていましたが、どんなルートでも同じコンセプトを使うことができる "保護された"必要があります。

上位コンポーネントは、コンポーネントの機能を単に「拡張」します。 Reduxの connectはHOCです。この場合、拡張機能は認証をチェックすることになります。同じようHOCをインポートし、あなたのルートファイルで

import React from 'react' 

export default function(ComposedComponent) { 

    class RequireAuth extends Component { 

    state = { 
     isAuthenticated: false 
    } 

    // Push to login route if not authenticated on mount 
    componentWillMount() { 
     if(!this.state.authenticated) { 
     // Use your router to redirect them to login page 
     } 
    } 

    // Push to login route if not authenticated on update 
    componentWillUpdate(nextProps) { 
     if(!this.state.authenticated) { 
     // Use your router to redirect them to login page 
     } 
    } 

    // Otherwise render the original component 
    render() { 
     return <ComposedComponent {...this.props}/> 
    } 

    } 

    return RequireAuth 

} 

:ときにコンポーネントマウント、あなたはそうのような新しいコンポーネントファイルを作成しなど、サーバーまたはのlocalStorageをチェックするかどうか、認証のための小切手を作りたいと思いますRequireAuthまたは類似のものなどのように使用します。

<Route exact path='/' component={RequireAuth(Home)} /> 

これは、多かれ少なかれ、次ん。それはルート・コンポーネントをレンダリングしようとしたとき、ルータがホームルートに当たると、それはRequireAuthチェックを実行します。 RequireAuthは、設定した認証の種類を確認し、isAuthenticatedの状態をtrueに設定する必要があります。それが本当でないなら、それはあなたのログインルートかそれに類するものにリダイレクトするべきです。 connectこのHOCを還元して、isAuthenticated状態をコンポーネントの状態ではなくストアに保存することもできます。

+0

ユーザーがアプリをナビゲートするたびにAPIを呼び出す必要がありますか?または単にlocalstorageのユーザーオブジェクトをチェックするだけですか? –

+0

毎回APIを呼び出すことはしません。認証状態を保存して問題なくそのまま使用できるようにするだけです。あなたが非アクティブまたは何かのX時間後にあなたをログアウトする銀行のような、より安全なアプリが必要な場合は、チェックするために関数を設定してAPIをもう一度打つことができます。 –

+0

私たちは通常、最初にログインチェックの 'onEnter'を実行します。これは1ページのアプリケーションであるため、ユーザーがページを更新しない限りチェックを1回だけ発生させます。 –

関連する問題