Node.jsでHTTP基本認証を実装
Node.js、Express 4 での HTTP 基本認証の解説 (日本語)
HTTP 基本認証は、Web サーバーにアクセスする際に、ユーザー名とパスワードの入力を要求するシンプルな認証方式です。Node.js と Express 4 を使用して、この認証を実装する方法について説明します。
Express アプリケーションのセットアップ
まず、Express アプリケーションを作成します。
const express = require('express');
const app = express();
const port = 3000;
app.listen(port, () => {
console.log(`Server listening on port ${por t}`);
});
HTTP 基本認証ミドルウェアの作成
次に、HTTP 基本認証のミドルウェアを作成します。これは、要求が認証されていない場合に、401 Unauthorized
ステータスコードを返します。
const basicAuth = require('basic-auth');
app.use((req, res, next) => {
const credentials = basicAuth(req);
if (!credentials || credentials.name !== 'your_username' || credentials.pass !== 'your_password') {
res.statusCode = 401;
res.setHeader('WWW-Authenticate', 'Basic realm="My Realm"');
res.end('Unauthorized');
} else {
next();
}
});
- 認証に失敗した場合、
401 Unauthorized
ステータスコードとWWW-Authenticate
ヘッダーを返します。 credentials.name
とcredentials.pass
には、正しいユーザー名とパスワードを指定します。basic-auth
パッケージは、HTTP 基本認証情報を取得するために使用されます。
保護されたルートの定義
最後に、保護したいルートを定義します。このルートにアクセスするには、認証が必要となります。
app.get('/protected', (req, res) => {
res.send('You are authorized!');
});
実行
このコードを実行し、ブラウザで http://localhost:3000/protected
にアクセスすると、認証ダイアログが表示されます。正しいユーザー名とパスワードを入力すると、保護されたコンテンツにアクセスできます。
注意
- より複雑な認証シナリオやセキュリティ要件がある場合は、専用の認証ライブラリやフレームワークを検討することをおすすめします。
- この例では、ユーザー名とパスワードはハードコーディングされています。実際のアプリケーションでは、適切な認証方法 (データベース、トークンなど) を使用してください。
Node.jsでHTTP基本認証を実装するコード解説 (日本語)
const express = require('express');
const app = express();
const port = 3000;
app.listen(port, () => {
console.log(`Server listening on port ${por t}`);
});
- ポート3000でサーバーを起動します。
express
モジュールをインポートし、Expressアプリケーションを作成します。
const basicAuth = require('basic-auth');
app.use((req, res, next) => {
const credentials = basicAuth(req);
if (!credentials || credentials.name !== 'your_username' || credentials.pass !== 'your_password') {
res.statusCode = 401;
res.setHeader('WWW-Authenticate', 'Basic realm="My Realm"');
res.end('Unauthorized');
} else {
next();
}
});
basic-auth
モジュールを使用して、HTTP基本認証情報を取得します。
app.get('/protected', (req, res) => {
res.send('You are authorized!');
});
- 認証に成功した場合、
You are authorized!
というメッセージを返します。 protected
ルートを定義し、認証が必要なルートとして保護します。
コードの解説
- 認証に成功した場合、次のミドルウェアまたはルートハンドラーに処理を移します。
basicAuth(req)
: HTTPリクエストから基本認証情報を取得します。
Passport.jsの使用
Passport.jsは、Node.jsアプリケーションに認証機能を追加するためのミドルウェアです。HTTP基本認証の戦略を提供しており、簡単に実装できます。
const passport = require('passport');
const BasicStrategy = require('passport-http').BasicStrategy;
passport.use(new BasicStrategy(
(username, passwor d, done) => {
// ユーザー名とパスワードの検証
if (username === 'your_username' && password === 'your_password') {
return done(null, { id: 1 }); // 認証成功
}
return done(null, false); // 認証失敗
}
));
app.use(passport.initialize());
app.use(passport.session());
app.get('/protected', passport.authenticate('basic', { session: false }), (req, res) => {
res.send('You are authorized!');
});
passport.authenticate('basic', { session: false })
ミドルウェアを使用して、認証を要求します。passport-http
モジュールを使用して、HTTP基本認証戦略を定義します。
Express.jsの組み込み認証機能
Express.jsには、組み込みの認証機能があります。ただし、HTTP基本認証は直接サポートされていませんが、カスタムミドルウェアを使用して実装できます。
app.use((req, res, next) => {
const authHeader = req.headers.authorization;
if (!authHeader) {
res.statusCode = 401;
res.setHeader('WWW-Authenticate', 'Basic realm="My Realm"');
res.end('Unauthorized');
} else {
const credentials = Buffer.from(authHeader.split(' ')[1], 'base64').toString().split(':');
const username = credentials[0];
const password = credentials[1];
// ユーザー名とパスワードの検証
if (username === 'your_username' && password === 'your_password') {
next();
} else {
res.statusCode = 401;
res.setHeader('WWW-Authenticate', 'Basic realm="My Realm"');
res.end('Unauthorized');
}
}
});
- ユーザー名とパスワードを検証し、認証に成功した場合、次のミドルウェアに処理を移します。
- Base64でエンコードされた認証情報をデコードし、ユーザー名とパスワードを抽出します。
req.headers.authorization
から認証ヘッダーを取得します。
他の認証ライブラリ
他にも、さまざまな認証ライブラリがNode.jsで使用できます。例えば、jsonwebtoken
やpassport-local
は、トークンベースの認証やローカルユーザー認証を実装するのに便利です。
node.js http express