私はReactアプリケーションにAuth0認証を追加しようと努めていますが、それが機能しているにもかかわらず、これにアプローチするより良い方法があるように感じます。私は認証ロジックのためのより良いパターンを理解するために苦労しています。認証されたReactコンポーネントとルートのより良いパターン
アプリの設定はreact + redux + react-router-redux + redux-saga + + auth0-lockimmutableです。上から順に
、App
コンポーネントは両方Builder
とEditor
コンポーネントはログインするユーザーを要求し、認証の処理を担当高次コンポーネントでauthenticated()
ラップそれぞれ、基本的なページレイアウトを定義します。現時点で
// index.js
import App from './containers/App';
import Builder from './containers/Builder';
import Editor from './containers/Editor';
import Home from './containers/Home';
import Login from './containers/Login';
import AuthContainer from './containers/Auth0/AuthContainer';
...
ReactDOM.render(
<Provider store={reduxStore}>
<Router history={syncedHistory}>
<Route path={'/'} component={App}>
<IndexRoute component={Home} />
<Route path={'login'} component={Login} />
<Route component={AuthContainer}>
<Route path={'builder'} component={Builder} />
<Route path={'editor'} component={Editor} />
</Route>
</Route>
<Redirect from={'*'} to={'/'} />
</Router>
</Provider>,
document.getElementById('app')
);
、AuthContainer
はisLoggedIn
ためReduxのストアをチェック除いてあまりしません。 isLoggedIn
がfalseの場合、ユーザーはコンポーネントを表示することができず、/login
にリダイレクトされます。
// containers/Auth0/AuthContainer.js
import React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { redirectToLogin } from './Auth0Actions';
class AuthContainer extends React.Component {
componentWillMount() {
if (!this.props.isLoggedIn) {
this.props.actions.redirectToLogin();
}
}
render() {
if (!this.props.isLoggedIn) {
return null;
}
return this.props.children;
}
}
// mapStateToProps(), mapDispatchToProps()
export default connect(mapStateToProps, mapDispatchToProps)(AuthContainer);
次の部分はAuth0です。 Auth0ロックは「リダイレクト」モードで動作します。つまり、ユーザーはアプリをログインしたままにしてから/login
にアプリにリダイレクトされます。リダイレクトの一環として、Auth0はURLの一部としてトークンを添付します。このトークンは、アプリケーションの読み込み時に解析する必要があります。
const lock = new Auth0Lock(__AUTH0_CLIENT_ID__, __AUTH0_DOMAIN__, {
auth: {
redirect: true,
redirectUrl: `${window.location.origin}/login`,
responseType: 'token'
}
});
Auth0が/login
にリダイレクトするので、Login
コンポーネントは、認証ロジックを必要とします。 AuthContainer
と同様に、還元店でisLoggedIn
を確認します。 isLoggedIn
が真の場合、ルート/
にリダイレクトされます。 isLoggedIn
がfalseの場合、認証を試みます。
// containers/Login/index.js
import React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { authenticate, redirectToRoot } from '../Auth0/Auth0Actions';
class Login extends React.Component {
componentDidMount() {
if (!this.props.isLoggedIn) {
this.props.actions.authenticate();
}
else {
this.props.actions.redirectToRoot();
}
}
render() {
return (
<div>Login Page</div>
);
}
}
// mapStateToProps(), mapDispatchToProps()
export default connect(mapStateToProps, mapDispatchToProps)(Login);
これらの部分を配置すると、Auth0との統合が機能しているようです。しかし、今私はAuthContainer
とLogin
コンポーネントを持っていて、それらは非常に似ています。ログインページが実際にログインするユーザーを必要としないので、私は理想的には、すべての認証ロジックが一つの場所に住んでいます。AuthContainer
の子として
をLogin
コンポーネントを配置することはできませんが、私は把握するのに苦労しています特にAuth0リダイレクトの特殊なケースでは、それを動作させる別の方法です。私は助けることはできませんが、別のアプローチ、反応+ reduxアプリで認証フローのためのより良いパターンがあると考える必要があります。
便利なことは、アプリケーションが初期化を開始する前に、ページの読み込みに非同期アクションをディスパッチする方法を理解することです。 Auth0はコールバックで動作するので、Auth0が登録されたコールバックを呼び出すまで、redux初期状態の設定を遅らせる必要があります。ページ読み込み時に非同期アクションを処理するための推奨される方法は何ですか?
私はアクションとサガのように、簡潔にするためにいくつかの作品を残してきたが、それが参考になるだろう場合、私はそれらを提供するために幸せを超えるだろう。
にあなたの最初の呼び出しの前にこれを行うことができますか?私はこれを昨日見つけました。https://github.com/facebook/react/issues/7671 – Hristo