Blog#199: 🔐Node.js Expressでの認証と認可

199

こんにちは、私はトゥアンと申します。東京からフルスタックWeb開発者です。 将来の有用で面白い記事を見逃さないように、私のブログをフォローしてください。😊

はじめに

この記事では、Node.js Expressアプリケーションにおける認証と認可の基本概念について説明します。認証と認可の違い、それらを実装するさまざまな方法、およびアプリケーションを効果的に保護する方法について解説します。

認証と認可の理解

認証

認証は、ユーザー、デバイス、システムの身元を確認するプロセスです。Webアプリケーションの文脈では、保護されたリソースに有効なユーザーのみがアクセスできるようにする仕組みです。

認可

一方、認可は、認証されたユーザーがアクセスできるアクションやリソースを決定するプロセスです。ユーザーの役割や属性に基づいて、許可と制限が適用されます。

Node.js Expressでの認証の実装

Passport.jsを使用する

Passport.jsは、Node.jsアプリケーションで認証プロセスを簡素化する人気のあるミドルウェアです。OAuth、OpenID Connect、ローカル認証など、複数のストラテジーに対応しています。ExpressアプリケーションにPassport.jsを統合するには、次の手順に従ってください。

  1. Passport.jsと必要なストラテジーをインストールします:
npm install passport passport-local
  1. アプリケーションでPassport.jsを設定します:
const express = require('express');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

const app = express();

// Passportローカルストラテジーの設定
passport.use(new LocalStrategy(
  function(username, password, done) {
    // ユーザー名とパスワードに基づいてユーザーを認証
  }
));

// Passportセッションの設定
passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  // IDに基づいてユーザーを取得
});

app.use(passport.initialize());
app.use(passport.session());
  1. ログインルートを実装します:
app.post('/login', passport.authenticate('local', {
  successRedirect: '/',
  failureRedirect: '/login',
  failureFlash: true
}));

JSON Web Tokens (JWT)を使用する

JSON Web Tokens(JWT) は、Webアプリケーションで認証を実装するもう1つの人気のある方法です。JWTは、ユーザー情報を含む自己完結型のトークンであり、ステートレスでスケーラブルです。JWT認証を実装するには、次の手順に従ってください。

  1. 必要なパッケージをインストールします:
npm install jsonwebtoken express-jwt
  1. JWTトークンを生成して署名します:
const jwt = require('jsonwebtoken');

function generateToken(user) {
  return jwt.sign(user, process.env.JWT_SECRET, { expiresIn: '1h' });
}
  1. ログインルートを実装します:
const jwt = require('jsonwebtoken');
const expressJwt = require('express-jwt');

app.post('/login', (req, res) => {
  // ユーザー名とパスワードに基づいてユーザーを認証
  // ...
  const token = generateToken(user);
  res.json({ token });
});

// JWTを使用してルートを保護する
app.use(expressJwt({ secret: process.env.JWT_SECRET }));

Node.js Expressでの認可の実装

ロールベースのアクセス制御(RBAC)

ロールベースのアクセス制御(RBAC) は、認可を実装する一般的なアプローチです。ユーザーにロールを割り当て、ロールに権限を付与します。ExpressアプリケーションでRBACを実装するには、次の手順に従ってください。

  1. ロールと権限を定義します:
const roles = {
  admin: {
    can: ['read', 'write', 'delete']
  },
  user: {
    can: ['read']
  }
};
  1. 権限をチェックするミドルウェアを実装します:
function can(permission) {
  return (req, res, next) => {
    const userRole = req.user.role;
    if (roles[userRole] && roles[userRole].can.includes(permission)) {
      next();
    } else {
      res.status(403).send('Forbidden');
    }
  };
}
  1. canミドルウェアを使用してルートを保護します:
app.get('/posts', can('read'), (req, res) => {
  // GET /postsルートを処理する
});

app.post('/posts', can('write'), (req, res) => {
  // POST /postsルートを処理する
});

app.delete('/posts/:id', can('delete'), (req, res) => {
  // DELETE /posts/:idルートを処理する
});

属性ベースのアクセス制御(ABAC)

属性ベースのアクセス制御(ABAC) は、認可を実装する別のアプローチです。ユーザー属性、環境、およびリソースに基づいて権限を付与します。ExpressアプリケーションでABACを実装するには、次の手順に従ってください。

  1. 属性を評価するポリシー関数を定義します:
function policy(user, action, resource) {
  if (action === 'read' && user.role === 'user') {
    return true;
  }

  if (action === 'write' && user.role === 'admin') {
    return true;
  }

  return false;
}
  1. ポリシーをチェックするミドルウェアを実装します:
function checkPolicy(action, resource) {
  return (req, res, next) => {
    if (policy(req.user, action, resource)) {
      next();
    } else {
      res.status(403).send('Forbidden');
    }
  };
}
  1. checkPolicyミドルウェアを使用してルートを保護します:
app.get('/posts', checkPolicy('read', 'post'), (req, res) => {
  // GET /postsルートを処理する
});

app.post('/posts', checkPolicy('write', 'post'), (req, res) => {
  // POST /postsルートを処理する
});

まとめ

この記事では、Node.js Expressアプリケーションにおける認証と認可の基本概念を説明しました。認証と認可の違いについて説明し、Passport.js、JWT、RBAC、ABACなどの実装方法について説明しました。これらの技術を実装することで、アプリケーションを効果的に保護し、権限のないアクセスから機密リソースを守ることができます。

最後

いつもお世話になっています。この記事を楽しんで、新しいことを学べたら嬉しいです。😊

今度の記事でお会いしましょう!この記事が気に入ったら、私を応援するために「LIKE」を押して登録してください。ありがとうございました。

NGUYỄN ANH TUẤN

Xin chào, mình là Tuấn, một kỹ sư phần mềm đang làm việc tại Tokyo. Đây là blog cá nhân nơi mình chia sẻ kiến thức và kinh nghiệm trong quá trình phát triển bản thân. Hy vọng blog sẽ là nguồn cảm hứng và động lực cho các bạn. Hãy cùng mình học hỏi và trưởng thành mỗi ngày nhé!

Đăng nhận xét

Mới hơn Cũ hơn