Coursera 笔记

Module 03 · Express Web Application FrameworkExpress Web 应用框架

Authentication in Node.jsNode.js 中的令牌身份验证与授权

Coursera ↗

🎥 视频目标:
在观看本视频后,您将能够:

  • 讨论基于令牌的身份验证在 Node.js 中的优势。
  • 在 Node.js 中实现基于令牌的身份验证与授权。

什么是身份验证?

身份验证是通过获取用户凭证并使用这些凭证来验证其身份的过程。身份验证旨在识别用户,并根据其身份提供相应的访问权限和内容。

身份验证方法

正如在其他视频中讨论的那样,身份验证可以通过以下方式实现:

  • 基于会话的身份验证(Session-based Authentication)
  • 基于令牌的身份验证(Token-based Authentication)
  • 无密码身份验证(Passwordless Authentication)

基于令牌的身份验证 是 Node.js 中最流行的身份验证方法。接下来,我们将介绍基于令牌身份验证的一些优势。


基于令牌的身份验证的优势

  • 可扩展性:令牌只需要存储在客户端,因此可以更轻松地扩展应用。
  • 灵活性:令牌可以跨多个服务器使用,并能为多个网站和应用提供认证。
  • 安全性:JWT(JSON Web Tokens)可以进行签名和加密,确保令牌不可篡改,且未经私钥加密无法被读取。

设置 Express.js API 服务器

让我们设置一个 Express.js API 服务器,为基于用户权限的员工信息提供访问。该应用将包括两个 API,每个 API 都有自己的端点:

  1. POST API 用于登录,返回一个 Web 令牌,发送用户名和密码作为请求体。
  2. GET API 作为资源端点,获取员工信息,只有已认证的用户才能访问。

代码示例:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());

app.get('/employees', (req, res) => {
    res.status(401).send('Please login to access this resource');
});

app.listen(5000, () => {
    console.log('API Server is localhost:5000');
});

此代码创建了一个 Web 服务器模块,通过调用 express() 函数并将其分配给常量 myapp。

  • myapp.get 函数创建了一个 GET API 端点,用于员工 API,当前对该端点的任何调用都会返回 HTTP 状态码 401,表示“未授权”,并带有消息:“请登录以访问此资源”。

要执行该 API,首先保存文件并命名为 api-server.js,然后运行命令:

node api-server.js

允许用户登录并生成令牌

下一部分代码允许用户登录,并在用户名和密码正确时返回生成的经过验证的令牌。
注意:用户名和密码通常存储在数据库中,但由于本示例中不涉及数据库连接,我们将在代码中硬编码用户名为 "user" 和密码为 "password"。

代码:

const jwt = require('jsonwebtoken');
const secret = 'mysecretkey';

app.post('/signin', (req, res) => {
    const { username, password } = req.body;
    if (username === 'user' && password === 'password') {
        const token = jwt.sign({ username }, secret);
        res.json({ token });
    } else {
        res.status(401).send('Invalid username and/or password');
    }
});

  • jsonwebtoken.sign() 方法生成 JWT。
  • 返回的 JSON 响应中包含生成的令牌。

安装 jsonwebtoken 包:

npm install jsonwebtoken

要在本视频中显示代码,我们将硬编码用户名和密码。但是请注意,JWT Secret应该始终使用密码生成器生成,并作为环境变量存储在配置文件中,而不是硬编码在API中,如下所示。


基于令牌的授权

接下来,我们定义一个 GET API 方法,使用 Authorization Header 来验证 JWT 令牌,以访问员工信息。
如果请求头中没有找到令牌,则会返回状态码 401,消息为“没有令牌”。

代码:

app.get('/employees', (req, res) => {
    const token = req.header('Authorization');
    if (!token) {
        return res.status(401).send('No Token');
    }

    try {
        const decoded = jwt.verify(token, secret);
        if (decoded.username === 'user') {
            res.status(200).send('Access Successful to Employee Endpoint');
        } else {
            res.status(401).send('Invalid Token');
        }
    } catch (err) {
        res.status(401).send('Invalid Token');
    }
});

  • 获取请求中的 Authorization 头部,验证其包含的令牌。
  • 如果令牌有效且用户名匹配,则返回 200 状态码,并授权访问员工 API。

API 服务器监听

最后,编写一个监听函数,监听 5000 端口,并在控制台打印消息:“API server is localhost:5000”。


总结

在本视频中,您学习了:

  • 基于令牌的身份验证的优势:可扩展性、灵活性和安全性。
  • POST API:用于用户登录,将凭证验证并生成 JWT 令牌。
  • GET API:用于资源授权,确定用户可以访问哪些资源。
  • JWT:用于认证用户并授权其访问特定资源。

通过使用基于令牌的身份验证,您可以构建更安全、灵活且可扩展的 Web 应用!