Node.js JWT的实现教程

1,615 阅读4分钟

Node.js JWT的实现

你好。在本教程中,我们将实现一个Node.js JWT(JSON Web Token),以保护应用程序端点免受未经授权的访问。

Node.js框架通常用于创建基于服务器的应用程序,并进一步用于向用户展示内容。

1.简介

JSON网络令牌(或JWT)是一个开放的RFC标准,它定义了一种紧凑和独立的方式来安全地将信息从服务器传输到客户端。一个json web令牌通常分为3个部分(头、有效载荷和签名),用一个点符号隔开,即[HEADER].[PAYLOAD].[SIGNATURE]。

  • 标头部分表示应用于令牌的加密操作。
  • 有效载荷部分表示使用该令牌传输的实际数据。它还包含诸如发行时间、到期时间和角色(可选)等信息。
  • 签名部分表示验证有效载荷在传输过程中没有改变。

1.1 设置Node.js

要在windows上设置Node.js,你需要从这个链接下载安装程序。点击你的平台的安装程序(也包括NPM包管理器),运行安装程序,开始Node.js设置向导。按照向导的步骤操作,完成后点击 "完成"。如果一切顺利,你可以导航到命令提示符来验证安装是否成功,如图1所示。

nodejs jwt - npm installation

图1: 验证node和npm的安装

2.Node.js JWT的实现

为了设置应用程序,我们将需要导航到我们的项目所在的路径。对于编程的东西,我正在使用Visual Studio Code作为我的首选IDE。你可以自由选择你喜欢的IDE。

2.1 设置依赖性

导航到项目目录,运行npm init -y ,创建一个package.json 文件。这个文件保存着与项目有关的元数据,用于管理项目的依赖性、脚本、版本等。在该文件中添加以下代码,我们将指定所需的依赖性。

package.json

{
  "name": "jwt",
  "version": "1.0.0",
  "description": "jwt implementation in nodejs",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "nodejs",
    "expressjs",
    "jwt",
    "restapi"
  ],
  "author": "yatbat",
  "license": "MIT",
  "dependencies": {
    "express": "^4.17.1",
    "jsonwebtoken": "^8.5.1"
  },
  "devDependencies": {
    "nodemon": "^2.0.12"
  }
}

要下载依赖项,请导航到包含该文件的目录路径,并使用npm install 命令。如果一切顺利,依赖项将被加载到node_modules 文件夹中,你就可以进行下一步的操作了。

2.2 设置Express webserver

在根文件夹中,在index.js 文件中添加以下内容。该文件将包含应用程序成功启动后将被激活的端点。

  • 创建访问令牌端点
  • 不受保护的端点
  • 受保护的端点将验证首先出现在请求头中的访问令牌,验证后返回成功响应。如果访问令牌验证失败,则会向用户返回禁止的错误。

index.js

// importing modules
const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();

const SECRET_KEY = 'MY_SECRET_KEY';

// non protected endpoint
// url - http://localhost:3001/api
app.get('/api', (req, res) => {
    res.status(200).json({ message: 'welcome to api service' });
});

// creating access token
// url - http://localhost:3001/api/login
app.post('/api/login', (req, res) => {
    // todo - add request body validation
    // throw 400 bad request if username or password is null
    // throw 401 unauthorized if username or password is incorrect

    // creating payload
    let nowInSeconds = new Date().getTime() / 1000;
    let payload = {
        aud: 'e78dc489-e37e-4aa3-9247-cd6b214da3e6',
        iss: 'node',
        sub: 'jcg',
        iat: nowInSeconds
    };
    // creating access-token
    const accessToken = jwt.sign(payload, SECRET_KEY, { algorithm: 'HS256', expiresIn: '1h' });
    res.status(201).json({ token: accessToken });
});

// protected endpoint
// will verify the access token first
// url - http://localhost:3001/api/protected
// note - add the authorization header in the request otherwise you will get 403 error
app.get('/api/protected', ensureToken, (req, res) => {
    // verifying the jwt token
    jwt.verify(req.token, SECRET_KEY, { algorithm: 'HS256' }, (err, data) => {
        if (err) {
            // console.log(err);
            res.status(403).json({ message: 'Forbidden' });
        }
        else {
            // console.log(data);
            res.status(200).json({ message: 'welcome to protected api service' });
        }
    });
});

// util method
function ensureToken(req, res, next) {
    const bearerHeader = req.headers['authorization'];
    // console.log('Bearer header received = ' + bearerHeader)
    if (typeof bearerHeader !== 'undefined') {
        const bearer = bearerHeader.split(' ');
        const bearerToken = bearer[1];
        req.token = bearerToken;
        next();
    } else {
        res.status(403).json({ message: 'Forbidden' });
    }
}

// start app
const PORT = process.env.port || 3001;
app.listen(PORT, () => {
    console.log(`Application listening on ${PORT}`);
});

3.运行应用程序

要运行该应用程序,请导航到项目目录并输入以下命令,如图2所示。如果一切顺利,应用程序将在端口号3001 上成功启动。

nodejs jwt - starting the app

图2:启动应用程序

4.演示

你可以自由地使用postman或任何其他你选择的工具来向应用程序端点发出HTTP请求。

// Non protected endpoint
// HTTP GET
http://localhost:3001/api

// Creating access token endpoint
// HTTP POST
http://localhost:3001/api/login

// Protected endpoint
// HTTP GET
http://localhost:3001/api/protected

这就是本教程的全部内容,我希望这篇文章能为你提供你想要的东西。祝你学习愉快,不要忘记分享!

5.总结

在本教程中,我们学习了如何使用jsonwebtoken 模块创建一个Node.js JWT(JSON Web Token),并在调用受保护的端点时验证访问令牌。你可以从下载区下载源代码和postman集合。

6.下载项目

这是一个关于如何在node.js应用程序中实现JWT(JSON网络令牌)的教程。

下载
你可以在这里下载这个例子的完整源代码: Node.js JWT实现