これは私の現在のプロジェクトで使用したプロセスです。ユーザーがログインすると、トークンを取得してlocalStorageに格納します。その後、ユーザーが任意のルートに移動するたびに、ルートがホッとしているコンポーネントがラップされます。トークンをチェックするHOCのコードは次のとおりです。
export function requireAuthentication(Component) {
class AuthenticatedComponent extends React.Component {
componentWillMount() {
this.checkAuth(this.props.user.isAuthenticated);
}
componentWillReceiveProps (nextProps) {
this.checkAuth(nextProps.user.isAuthenticated);
}
checkAuth (isAuthenticated) {
if (!isAuthenticated) {
let redirectAfterLogin = this.props.location.pathname;
browserHistory.push(`/login?next=${redirectAfterLogin}`);
}
}
render() {
return (
<div>
{this.props.user.isAuthenticated === true
? <Component {...this.props}/>
: null
}
</div>
)
}
}
const mapStateToProps = (state) => ({
user: state.user
});
return connect(mapStateToProps)(AuthenticatedComponent);
}
はその後、私のindex.jsに私はそうのように、このHOCで保護された各ルートをラップ:
<Route path='/protected' component={requireAuthentication(ProtectedComponent)} />
これは、ユーザーの減速がどのように見えるかです。
export default function userReducer(state = {}, action) {
switch(action.type) {
case types.USER_LOGIN_SUCCESS:
return {...action.user, isAuthenticated: true};
default:
return state;
}
}
action.userにトークンが含まれています。トークンは、ユーザーが最初にログインするときにapiから来るか、このユーザーがすでにログインしているユーザーであればlocalstorageから来ることができます。
セッションまたはローカルストレージにトークンを格納します。アプリケーションの起動時にエンドポイントを公開してトークンを検証します。トークンが存在していても有効な場合は、ログインし直さずにトークンを入れてください。トークンがないか無効であれば、ログイン画面にキックしてトークンを削除してください。 – kentcdodds
クライアント側のものは安全ではないので、サーバ側の入力を常に検証する必要があります(この場合、ユーザがログインしてトークンを提供した後にログインが必要なページのみを提供してください)。 –