node实现基于token的身份验证

yizhihongxing

下面是我对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日

相关文章

  • javascript设计模式 – 迭代器模式原理与用法实例分析

    JavaScript设计模式 – 迭代器模式原理与用法实例分析 迭代器模式通常被用于遍历数据结构。该模式提供了一种自定义遍历的方式,同时屏蔽了底层数据结构的实现细节。在 JavaScript 中,迭代器模式通常被应用于处理数组和类似数据结构的数据。在本文中,我们将会深入讲解迭代器模式的原理,并结合两个实际例子帮助你更好的理解。 迭代器模式的原理 在 Java…

    node js 2023年6月8日
    00
  • Angular之jwt令牌身份验证的实现

    下面是“Angular之jwt令牌身份验证的实现”的完整攻略: 什么是JWT令牌 JSON Web Token(JWT)是一种轻量级的安全性访问令牌,主要用于在网络应用中传递被授权的信息。JWT由三部分组成,分别是头部、载荷和签名。 头部: 通常由两部分组成,类型和加密算法。 载荷: 所要传递的信息。 签名: 保证信息没有被篡改过。 在服务器端口生成令牌,将…

    node js 2023年6月8日
    00
  • TypeScript 5.0 正式发布及使用指南详解

    TypeScript 5.0 正式发布及使用指南详解 什么是TypeScript? TypeScript 是一种开源的跨平台编程语言,由微软开发和维护。它是 JavaScript 的超集,包含了 JavaScript 的所有语法,并在此基础上增加了静态类型、类、接口、命名空间等特性,同时还提供了更好的开发环境和工具支持。 使用 TypeScript 可以帮助…

    node js 2023年6月8日
    00
  • node.js回调函数之阻塞调用与非阻塞调用

    当我们在node.js中执行一个耗时操作时,例如读取文件、请求网络数据等,会出现执行时间较长的情况,这会导致整个程序阻塞,影响程序的性能。为了解决这个问题,Node.js采用了回调函数的机制来实现非阻塞调用。 阻塞调用 阻塞调用是指应用程序在执行一个函数时,必须等待该函数执行完成,才能继续执行后面的代码。当我们在node.js中进行文件读取时,如果使用阻塞调…

    node js 2023年6月8日
    00
  • Node实现前端本地开发接口代理服务

    下面是关于“Node实现前端本地开发接口代理服务”完整攻略的详细说明。 什么是接口代理服务 前端开发过程中,常常需要请求后端接口获取数据。但是在本地开发环境中,由于前后端不在同一个服务器上,经常会遇到跨域问题。为了解决这个问题,我们可以使用接口代理服务。 接口代理服务,指将前端开发环境中的某个 API 请求转发到真实的后端 API 服务器上,并将其响应结果返…

    node js 2023年6月8日
    00
  • nodejs+axios爬取html出现中文乱码并解决示例

    下面是详细的攻略: 1. 前置知识 在讲解 nodejs+axios 爬取html出现中文乱码并解决示例之前,我们需要先了解以下术语和知识点: Node.js:一个基于Chrome V8引擎的JavaScript运行时,让JavaScript可以脱离浏览器运行,即在服务器端运行。 Axios:一个基于Promise的HTTP客户端,用于浏览器和Node.js…

    node js 2023年6月8日
    00
  • vue mvvm数据响应实现

    Vue是一款流行的前端框架,其中的MVVM设计模式实现了数据的响应式更新。在Vue中,当数据发生变化时,视图会自动更新,反之亦然。下面是“Vue MVVM数据响应实现”的攻略: 1. 数据响应式设计 Vue中实现数据响应式的核心概念是“侦听器”,其通过Object.defineProperty()方法或ES6 Proxy API(更高版本的Vue中采用的方法…

    node js 2023年6月8日
    00
  • nodejs中的异步编程知识点详解

    Node.js中的异步编程知识点详解 什么是异步编程 在 Node.js 中,异步编程是非常常见的,它可以让程序更高效地利用资源,提高了程序的性能。 异步编程是指程序不需要等待某个操作完成,就能继续进行下一步操作。它通常会发送一些请求,然后继续执行其他任务,直到得到请求的响应后再执行相应的回调函数。 异步编程的优势 更高效的利用资源 在执行某个任务的同时,我…

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