준공식 예
with-cookie-auth
예에서 리디렉션 getInitialProps
. 유효한 패턴인지 아직 확실하지 않지만 다음 코드가 있습니다.
Profile.getInitialProps = async ctx => {
const { token } = nextCookie(ctx)
const apiUrl = getHost(ctx.req) + '/api/profile'
const redirectOnError = () =>
typeof window !== 'undefined'
? Router.push('/login')
: ctx.res.writeHead(302, { Location: '/login' }).end()
try {
const response = await fetch(apiUrl, {
credentials: 'include',
headers: {
Authorization: JSON.stringify({ token }),
},
})
if (response.ok) {
const js = await response.json()
console.log('js', js)
return js
} else {
// https://github.com/developit/unfetch#caveats
return await redirectOnError()
}
} catch (error) {
// Implementation or Network error
return redirectOnError()
}
}
서버 측과 클라이언트 측을 모두 처리합니다. 그만큼fetch
호출은 실제로 인증 토큰을 얻을 하나, 별도의 함수로이를 캡슐화 할 수 있습니다입니다.
내가 대신 조언하는 것
1. 서버 측 렌더로 리디렉션 (SSR 중에 플래시 사용 안 함)
가장 일반적인 경우입니다. 처음로드 할 때 초기 페이지가 깜박이지 않도록이 시점에서 리디렉션하려고합니다.
MyApp.getInitialProps = async appContext => {
const currentUser = await getCurrentUser(); // define this beforehand
const appProps = await App.getInitialProps(appContext);
// check that we are in SSR mode (NOT static and NOT client-side)
if (typeof window === "undefined" && appContext.ctx.res.writeHead) {
if (!currentUser && !isPublicRoute(appContext.router.pathname)) {
appContext.ctx.res.writeHead(302, { Location: "/account/login" });
appContext.ctx.res.end();
}
}
return { ...appProps, currentUser };
};
2. componentDidMount에서 리디렉션 (SSR이 비활성화 된 경우 (예 : 정적 모드)에 유용)
이것은 클라이언트 측 렌더링의 대체입니다.
componentDidMount() {
const { currentUser, router } = this.props;
if (!currentUser && !isPublicRoute(router.pathname)) {
Router.push("/account/login");
}
}
정적 모드에서 초기 페이지를 플래시하지 않아도이 지점을 추가 할 수 있습니다. 정적 빌드 중에 리디렉션 할 수는 없지만 일반적인 방법보다 낫습니다. 진행하면서 편집하려고합니다.
전체 예는 여기
슬프게도 클라이언트 만 답변하는 관련 문제