受託開発などの形態の場合は結構必要になることがあるかと思います。このページでは、next
実行で何かしらのページが表示されるまでの構築は済んでいるものとします。
仕組み
NextJS のページとなるコンポーネントにはgetInitialProps
というライフサイクル関数を置けます。この関数は初回(最初にページを開く時)はサーバーサイド側で実行され、引数に様々な値の入ったctx
を受け取ります。
サーバーサイドの時のみこのctx
にはrequest
(IncomingMessage
)とresponse
(ServerResponse
)が含まれるので、それらで Basic 認証を実装します。
例
あるぺージコンポーネントPage
のgetInitialProps
を以下のように実装します。
const USER_PASS = 'nju33:secret'
const sendUnauthorized = res => {
res.writeHead(401, {
'www-authenticate': 'Basic realm=secret string'
});
res.end();
};
Page.getInitialProps = ({req, res}) => {
if (!process.browser) {
const authorization = req.headers['authorization'];
if (typeof authorization === 'undefined') {
sendUnauthorized(res);
return;
}
const matches = authorization.match(/[^\s]+$/);
if (matches === null) {
sendUnauthorized(res);
return;
}
const userPass = Buffer.from(
matches[0],
'base64'
).toString();
if (userPass !== USER_PASS) {
sendUnauthorized(res);
return;
}
}
return {message: 'foo'};
};
export default Page;
これは、
authorization
が無い時はwww-authenticate
を返すある時は
USER_PASS
と値を比較し、同じじゃないなら再度www-authenticate
を返す同じなら
props
となるオブジェクトを返す
のようなことをやってます。
うまくいくと画像のようになるはずです。