+4

🔐Node.js Expressでの認証と認可

はじめに

この記事では、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などの実装方法について説明しました。これらの技術を実装することで、アプリケーションを効果的に保護し、権限のないアクセスから機密リソースを守ることができます。

Mình hy vọng bạn thích bài viết này và học thêm được điều gì đó mới.

Donate mình một ly cafe hoặc 1 cây bút bi để mình có thêm động lực cho ra nhiều bài viết hay và chất lượng hơn trong tương lai nhé. À mà nếu bạn có bất kỳ câu hỏi nào thì đừng ngại comment hoặc liên hệ mình qua: Zalo - 0374226770 hoặc Facebook. Mình xin cảm ơn.

Momo: NGUYỄN ANH TUẤN - 0374226770

TPBank: NGUYỄN ANH TUẤN - 0374226770 (hoặc 01681423001)

image.png


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí