Express.js 项目中的鉴权和授权实现

在 Express.js 项目中,鉴权和授权是非常重要的一环。实现一个健壮的鉴权和授权系统,能够确保你的应用程序只给被授权的用户提供访问权限。本文将详细介绍在 Express.js 项目中实现鉴权和授权的方法。

鉴权和授权的区别

在开始讨论如何在 Express.js 项目中实现鉴权和授权之前,让我们先了解一下这两个术语的含义。

  • 鉴权:确保某个用户是合法的用户,具有访问某个资源的权限。
  • 授权:根据用户的身份和角色,决定该用户是否有权访问某个资源。

简单说来,鉴权是验证用户身份的过程,而授权是决定用户是否有权访问某个资源的过程。

在 Express.js 中实现鉴权和授权

在 Express.js 中实现鉴权和授权,主要可以通过两种方式实现:session 和 token。

Session-based 身份验证

使用 Session-based 身份验证的方法,主要包括以下几个步骤:

    1. 用户向服务器发送登录请求。服务器验证用户的身份,如果验证通过会在服务器端创建一个 session 对象。
    1. 服务器端返回登录成功后的响应,同时将 session ID 在 Set-Cookie 中返回给客户端。
    1. 对于每一个后续请求,客户端都会将 session ID 带在 Cookie 中发给服务器,服务器可以通过该 session ID 找到对应的 session 对象。
    1. 服务器端根据 session 对象中存储的用户信息去判断用户是否有权限访问请求的资源。

以下是一个在 Express.js 中使用 session-based 鉴权的示例:

const express = require('express');
const session = require('express-session');

const app = express();

// 使用 session 中间件
app.use(session({
  secret: 'some_secret_key',
  resave: false,
  saveUninitialized: true,
  cookie: {
      httpOnly: true,
      secure: true,
      maxAge: 3600000
  }
}));

// 用户登录操作
app.post('/login', (req, res) => {
  // 校验用户信息
  const userInfo = {
    username: 'test',
    password: 'test123'
  };
  if (req.body.username === userInfo.username && req.body.password === userInfo.password) {
    // 验证通过,设置 session
    req.session.userInfo = userInfo;
    res.json({
      code: 0,
      msg: '登录成功'
    });
  } else {
    // 验证失败
    res.json({
      code: 1,
      msg: '用户名或密码错误'
    });
  }
});

// 需要登录后才能访问的 API
app.get('/user', (req, res) => {
  if (req.session.userInfo) {
    res.json({
      code: 0,
      msg: '您已登录'
    });
  } else {
    res.json({
      code: 401,
      msg: '未登录'
    });
  }
});

Token-based 身份验证

使用 Token-based 身份验证的方法,主要包括以下几个步骤:

    1. 用户向服务器发送登录请求。服务器验证用户的身份,如果验证通过则生成一个 token,返回给客户端。
    1. 客户端在每个请求中将 token 作为一个参数或者放在请求头中发送给服务器。
    1. 服务器检查这个 token 是否是有效的,如果有效则允许用户访问请求的资源。

以下是一个在 Express.js 中使用 token-based 鉴权的示例:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

app.post('/login', (req, res) => {
  // 校验用户信息
  const userInfo = {
    username: 'test',
    password: 'test123'
  };
  if (req.body.username === userInfo.username && req.body.password === userInfo.password) {
    // 验证通过,生成 token
    const token = jwt.sign({ username: userInfo.username }, 'some_secret_key', { expiresIn: '1h' });
    res.json({
      code: 0,
      msg: '登录成功',
      token
    });
  } else {
    // 验证失败
    res.json({
      code: 1,
      msg: '用户名或密码错误'
    });
  }
});

// 需要登录后才能访问的 API
app.get('/user', (req, res) => {
  const token = req.headers.authorization.split(' ')[1]; // 获取 Authorization Header 中的 token
  try {
    const decoded = jwt.verify(token, 'some_secret_key');
    res.json({
      code: 0,
      msg: '您已登录'
    });
  } catch (err) {
    res.json({
      code: 401,
      msg: '未登录'
    });
  }
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

总结

本文介绍了在 Express.js 项目中实现鉴权和授权的两种方法:session-based 和 token-based。无论是哪种方式,都需要严格校验用户的身份和权限,确保用户只能访问它们被授权的资源。希望读者们可以掌握本文介绍的内容,并在自己的项目中加以应用。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659523bfeb4cecbf2d95ce1b


纠错反馈