node实现基于token的身份验证

下面是我对Node实现基于Token的身份验证的完整攻略。

基于Token的身份验证

基于Token的身份验证是一种常见的身份验证方式,是Web应用程序中比较安全和可扩展的一种身份验证方式。其主要原理是,客户端在进行登录操作时,向后端发送登录请求,后端验证成功后生成一个Token并返回给客户端,客户端将Token存储在本地,以后的每个请求都会带上这个Token,后端通过验证Token的有效性来判断用户是否已经登录。

实现方式

  1. 安装依赖

在node中,我们可以使用 jsonwebtoken 包来创建Token,可以使用 passport 来验证Token。

npm i jsonwebtoken passport passport-jwt
  1. 生成Token

在登录成功后,我们需要为用户生成一个Token。可以使用 jwt.sign() 方法来生成Token:

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

const token = jwt.sign({username: 'david'}, secret);

在上面的例子中,我们使用带有一个密钥的 jwt.sign() 方法生成了一个Token。Token的第一个参数是一个包含用户信息的对象,第二个参数则是一个密钥,这个密钥应该保存在后端服务中,而不应该被泄露给任何人。生成的Token可以作为一个字符串返回给客户端。

  1. 验证Token

在每个请求中,客户端应该将Token作为请求的一个Header参数发送到后端服务中。我们可以使用 passport-jwt 来验证Token:

const passport = require('passport');
const passportJwt = require('passport-jwt');
const JwtStrategy = passportJwt.Strategy;
const ExtractJwt = passportJwt.ExtractJwt;

const secret = 'mysecret';
const options = {};
options.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
options.secretOrKey = secret;

passport.use(new JwtStrategy(options, (payload, done) => {
  if (payload.username === 'david') {
    done(null, {username: 'david'});
  } else {
    done(null, false);
  }
}));

在上面的例子中,我们使用 ExtractJwt.fromAuthHeaderAsBearerToken() 方法从请求头中获取Token,并将Token解析成一个对象。在 passport.use() 方法中,我们定义了一个验证策略,并使用 done() 方法返回用户信息,或者返回一个false值,如果找不到相应的Token。

示例

下面是两个基于Token身份验证的示例:

示例1:登录和验证

在这个示例中,我们演示了如何使用Express框架实现基于Token的身份验证。我们将使用POST方法进行登录,使用GET方法进行身份验证。

const express = require('express');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const passport = require('passport');
const passportJwt = require('passport-jwt');
const JwtStrategy = passportJwt.Strategy;
const ExtractJwt = passportJwt.ExtractJwt;

const app = express();
app.use(bodyParser.json());
app.use(passport.initialize());

// 定义一个密钥
const secret = 'mysecret';

// 定义一个Mock用户
const users = [
  {username: 'david', password: '123456'}
];

// 定义一个登录接口
app.post('/login', (req, res) => {
  const {username, password} = req.body;
  const user = users.find(user => user.username === username && user.password === password);
  if (!user) {
    res.status(401).send({message: '登录失败,请检查用户名和密码'});
  } else {
    const token = jwt.sign({username}, secret);
    res.send({token});
  }
});

// 定义一个验证接口
app.get('/verify', passport.authenticate('jwt', {session: false}), (req, res) => {
  res.send({message: '身份验证通过'});
});

// 配置验证策略
const options = {};
options.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
options.secretOrKey = secret;

passport.use(new JwtStrategy(options, (payload, done) => {
  const user = users.find(user => user.username === payload.username);
  if (user) {
    done(null, {username: user.username});
  } else {
    done(null, false);
  }
}));

// 启动服务
app.listen(3000, () => {
  console.log('Server started at http://localhost:3000');
});

上面的代码中定义了一个/login接口,用于登录,当登录成功后会返回一个Token;同时定义了一个/verify接口,用于验证身份。在/passport.use()方法中我们定义了一个验证策略,使用身份验证头部中必须带有Bearer Token的模式进行解码。在这里我们假设用户信息已经在后端服务中,直接通过用户名来验证Token。

示例2:使用JavaScript Fetch API进行请求

下面是一个使用JavaScript Fetch API进行请求的示例代码:

const token = localStorage.getItem('token');

fetch('http://localhost:3000/verify', {
  method: 'GET',
  headers: {
    'Authorization': `Bearer ${token}`
  }
})
.then(response => response.json())
.then(data => console.log(data));

在这个示例中,我们从浏览器的localStorage中读取Token,然后将Token添加到身份验证头部中进行请求。在服务器端,身份验证头部中的Token将被解析并且验证,如果验证通过则返回一个响应。在客户端中,我们可以使用 response.json() 方法来获取响应的JSON格式数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node实现基于token的身份验证 - Python技术站

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

相关文章

  • Linux 安装nodejs环境及路径配置详细步骤

    下面是详细讲解“Linux 安装nodejs环境及路径配置详细步骤”的完整攻略。 安装nodejs环境 在Linux系统中,我们可以通过以下步骤来安装nodejs环境。 下载nodejs安装包 访问nodejs官网,找到适合你系统的版本,下载压缩包。 解压安装包 在终端运行以下命令,解压nodejs安装包: tar -xzvf node-vxx.xx.xx-…

    node js 2023年6月8日
    00
  • 详解Node.JS模块 process

    详解Node.JS模块 process Node.JS提供了一个全局模块process,它提供了与当前进程的交互能力。在本文中,我们会详细介绍process模块的各种用法。 获取启动NodeJS应用程序的命令行参数 process模块的argv属性返回一个数组,该数组包含了NodeJS应用程序启动时传递给程序的命令行参数。 // demo1.js conso…

    node js 2023年6月8日
    00
  • Node.js中调用mysql存储过程示例

    下面是关于“Node.js中调用mysql存储过程”的完整攻略。 1. 安装mysql包 要在Node.js中操作mysql,首先需要安装mysql包。打开终端或命令行窗口,输入以下命令进行安装: npm install mysql 2. 连接mysql数据库 在使用mysql包前,需要先连接上mysql数据库。使用下面的代码来连接MySQL数据库: con…

    node js 2023年6月8日
    00
  • 在JS循环中使用async/await的方法

    当在JavaScript中使用循环时,通常我们会面临一个问题,即如何同时异步执行循环体中的多个异步操作,并在它们都完成后执行下一步操作。对于这种情况,我们可以使用async/await结合并发循环来解决这个问题。 使用Promise.all结合循环并发执行异步操作 一种常见的使用async/await结合并发循环的方法是使用Promise.all。假设我们有…

    node js 2023年6月8日
    00
  • Node.js实现文件上传的示例

    下面我将为你介绍一下“Node.js实现文件上传的示例”的完整攻略。 什么是文件上传 文件上传是指将本地的文件上传到服务器上的过程。在Web开发中经常要用到文件上传,比如用户上传头像、PDF文件以及其他文档等。 Node.js实现文件上传的示例 Node.js可以很方便地实现文件上传,需要用到第三方模块formidable。下面是实现文件上传的步骤: 步骤1…

    node js 2023年6月8日
    00
  • 原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)

    下面是关于“原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)”的完整攻略,包含以下几个部分: 关于原生JS封装ajax 原生JS可以使用XMLHttpRequest对象来发送http请求,通过该对象的open()和send()方法来实现。但是,为了方便和规范使用ajax,我们可以封装一个ajax函数。下面是一个基本的封装实现: f…

    node js 2023年6月8日
    00
  • Express + Session 实现登录验证功能

    以下是详细的“Express + Session 实现登录验证功能”的完整攻略。 什么是 Session Session 是用来存储用户与 web 服务器交互过程中产生的数据的一种机制。当用户访问 web 服务器时,服务器会生成一个 Session ID,用来标识用户的身份信息,将其发送给客户端,客户端在访问服务器时带上这个 Session ID,服务器根据…

    node js 2023年6月8日
    00
  • Node.js自定义实现文件路由功能

    下面是Node.js自定义实现文件路由功能的完整攻略: 环境准备 首先,我们需要安装Node.js。在Node.js官网(https://nodejs.org/en/)上下载安装包,安装完成后打开命令行工具,输入node -v查看是否安装成功。 创建项目 在命令行中进入你的项目根目录(可以通过cd命令进入),执行以下命令: npm init -y 这个命令将…

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