nodejs中的express-jwt的使用解读

下面就来详细讲解“nodejs中的express-jwt的使用解读”的完整攻略。

什么是express-jwt

express-jwt是一个基于jwt(jsonwebtoken)认证的中间件,用于验证客户端发来的请求是否合法。

安装express-jwt

在终端中运行以下命令来安装express-jwt

npm install express-jwt

使用express-jwt

使用express-jwt中间件可以很容易的进行jwt认证。下面是一个基本的应用程序的示例:

const express = require('express')
const jwt = require('jsonwebtoken')
const expressJwt = require('express-jwt')

const app = express()

app.use(expressJwt({ secret: 'myscrettoken' }).unless({ path: ['/login'] }))

app.get('/login', (req, res) => {
  const user = { id: 1 }
  const token = jwt.sign(user, 'myscrettoken')
  res.send(token)
})

app.get('/protected', (req, res) => {
  res.send(req.user)
})

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

上述代码中,我们使用了express-jwt中间件,并将其作为全局的中间件使用,以便对每个发送到服务器的请求都进行认证。我们还指定了myscrettoken作为key用于jwt认证。

我们可以通过调用unless方法来将请求路径添加到保护的列表中。在本例中,我们不需要对/login路径进行jwt认证。

当我们启动应用程序并访问/login路径时,将会得到一个jwt token。将该token复制到HTTP请求的Authorization头中,如下所示:

Authorization: Bearer <your_token_here>

当我们访问/protected路径时,将会验证jwt token是否有效。如果有效,req.user将会包含解码的jwt token。

另一个示例

下面是另一个示例,使用express-jwt来限制API只允许受信任的客户端访问:

const express = require('express')
const jwt = require('jsonwebtoken')
const expressJwt = require('express-jwt')

const app = express()

const clients = [
  {
    id: 'web',
    secret: 'web-secret',
    redirectUri: '/auth/callback'
  },
  {
    id: 'mobile',
    secret: 'mobile-secret',
    redirectUri: '/auth/callback'
  }
]

const trustedClients = {
  'web-secret': 'web',
  'mobile-secret': 'mobile'
}

app.use(express.json())

app.get('/auth/:id', (req, res) => {
  const client = clients.find(client => client.id === req.params.id)

  if (client) {
    res.send(`
      <form method="post" action="/auth/${client.id}/approve">
        <input type="password" name="password" placeholder="Enter password" />
        <button type="submit">Approve</button>
      </form>
    `)
  } else {
    res.status(404).send('Client not found')
  }
})

app.post('/auth/:id/approve', (req, res) => {
  const client = clients.find(client => client.id === req.params.id)

  if (client) {
    if (req.body.password === 'password') {
      const token = jwt.sign({ sub: client.id }, client.secret)
      res.redirect(`${client.redirectUri}?token=${encodeURIComponent(token)}`)
    } else {
      res.status(401).send('Invalid password')
    }
  } else {
    res.status(404).send('Client not found')
  }
})

app.get('/api', expressJwt({
  secret: (req, payload, done) => done(null, trustedClients[payload.clientSecret]),
  algorithms: ['HS256'],
  issuer: 'https://localhost/auth'
}))

app.get('/api/data', (req, res) => {
  res.send('Hello from the trusted client!')
})

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

在上面的示例中,express-jwt中间件被用来实施API保护。 客户端需要先通过进行身份验证才能访问受保护的API。

首先,客户端向/auth/:id路径发送身份验证请求,其中:id是客户端的ID。 它将渲染一个表单,用户可以使用密码输入进行身份验证。 如果密码正确,则将生成一个JWT token并将其重定向回客户端。 token包含sub字段,其中包含客户端的ID。 客户端将使用此token在后续请求中进行身份验证。

/api/api/data是受保护的API路径。/api路径使用express-jwt中间件以验证客户端是否已进行身份验证。 当客户端发送JWT token时,express-jwt会使用客户端提供的secret key来验证token的有效性。如果token有效,则客户端将可以访问/api/data路径并得到一条Hello from the trusted client!信息。

这两个示例提供了express-jwt的不同用法,其中第一个用来实施JWT身份验证以保护资源,而第二个用来实施基于客户端身份验证的API保护。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:nodejs中的express-jwt的使用解读 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • vue报错Error:Cannot find module ‘fs/promises’的解决方式

    针对“vue报错Error:Cannot find module ‘fs/promises’”这个问题,我们可以按照以下步骤进行解决: 问题分析 这个问题通常会出现在使用 Vue 3.x 版本的时候,它提示我们在运行Vue项目时缺少了Node.js的fs模块,具体报错是“Cannot find module ‘fs/promises’”。 造成这个问题的原因…

    node js 2023年6月8日
    00
  • node.js中的fs.renameSync方法使用说明

    Node.js中的fs.renameSync方法使用说明 fs.renameSync(oldPath, newPath)方法用于对指定文件或目录进行重命名操作。本攻略将详细讲解fs.renameSync方法的使用方法。 方法参数 fs.renameSync()方法接受两个字符串类型的参数,分别是原文件/目录的路径(oldPath)和新文件/目录的路径(new…

    node js 2023年6月8日
    00
  • Vue路由History模式分析

    Vue路由History模式分析 Vue Router 是 Vue 的官方路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。Vue Router 可以让我们通过前端路由来实现页面之间的切换和跳转,它的 History 模式一般用于生产环境并且需要后端支持。 History 模式 Vue Router 根据浏览器的不同,支持两种路由…

    node js 2023年6月8日
    00
  • 深入理解Angularjs 脏值检测

    接下来我将为您详细讲解“深入理解Angularjs 脏值检测”的完整攻略。 什么是脏值检测 在AngularJS中,所有的模型数据都被存储在$scope对象中,而这些数据的变化是由用户的操作或者系统自身的操作引起的。为了使模型数据和视图保持同步,AngularJS框架使用了脏值检测机制。 所谓脏值检测,就是通过比较当前值和上一次的值是否发生改变来检测模型变化…

    node js 2023年6月8日
    00
  • Node 代理访问的实现

    Node 代理访问的实现可以分为两步: 使用 http.request 或 https.request 创建一个代理请求,并将请求转发给目标服务器。示例如下: const http = require(‘http’); http.createServer(function(req, res) { console.log(req.url); const opt…

    node js 2023年6月8日
    00
  • 详解node登录接口之密码错误限制次数(含代码)

    下面是对题目所提到的完整攻略的详细讲解。 标题:详解node登录接口之密码错误限制次数(含代码) 概述 密码错误限制次数是在用户登录时,为了防止恶意攻击和密码猜测,而限制用户输入错误密码的次数,达到一定的次数后,将会给用户一个提示,要么等待一段时间后继续登录,要么通过其他方式找回密码。本攻略将详细讲解如何在Node.js中实现密码错误次数限制功能。 实现思路…

    node js 2023年6月8日
    00
  • 详解node服务器中打开html文件的两种方法

    下面是详解”详解Node.js服务器中打开HTML文件的两种方法”的完整攻略。 一、前言 很多时候我们需要在Node.js服务器中打开HTML文件,然后呈现给用户。那么Node.js服务器中有哪些方式可以打开HTML文件呢?下面就来详细讲解一下相关的两种方法。 二、方法一:使用Node.js内置的Http模块 Node.js内置的Http模块提供了创建Web…

    node js 2023年6月8日
    00
  • Express+Nodejs 下的登录拦截实现代码

    下面是Express+Nodejs下的登录拦截实现代码的攻略: 一、前置知识 在学习登录拦截实现之前,需要掌握以下知识: Node.js基础知识,包括模块化、文件系统、HTTP模块等; Express框架的基本使用方法; cookie和session的基本概念和使用方法。 二、实现登录拦截的基本思路 实现登录拦截需要结合cookie和session技术,其基…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部