首页 > 编程语言 >nodejs编写退出登录的接口逻辑

nodejs编写退出登录的接口逻辑

时间:2024-07-08 14:27:50浏览次数:12  
标签:const 登录 nodejs res req JWT 接口 token 黑名单

目录

1.安装必要的依赖

2.登录成功生成和返回 JWT

3.在服务器端维护一个黑名单列表,记录已失效的 JWT

4.在验证 JWT 时检查黑名单

5.退出登录时将 JWT 添加到黑名单中

完整代码

nodejs实现退出登录接口的逻辑,通常包括以下步骤:

  1. 安装必要的依赖
  2. 登录成功生成和返回 JWT。
  3. 在服务器端维护一个黑名单列表,记录已失效的 JWT。
  4. 在验证 JWT 时检查黑名单。
  5. 退出登录时将 JWT 添加到黑名单中。

1.安装必要的依赖

npm install express jsonwebtoken express-jwt body-parser

2.登录成功生成和返回 JWT

app.post('/login', (req, res) => {
  // 验证用户名和密码
  const { username, password } = req.body;
  // 模拟登录成功,通常是要访问数据库的
  if(username = 'admin' && password = 'admin'){
    const token = jwt.sign({ username }, secret, { expiresIn: '1h' });
    res.send({ code:0,msg: '登录成功',data:token  });
  }else{
    res.status(401).send({ code:0,msg: '账户或密码错误' });
  }
});

3.在服务器端维护一个黑名单列表,记录已失效的 JWT

const blacklistedTokens = [];

// 中间件:解析和验证 JWT
const authenticateJwt = expressJwt({
  secret,
  algorithms: ['HS256'],
  isRevoked: (req, payload, done) => {
    const token = req.headers['authorization'].split(' ')[1];
    if (blacklistedTokens.includes(token)) {
      return done(null, true); // token 已经失效
    }
    done();
  }
});

4.在验证 JWT 时检查黑名单

isRevoked: (req, payload, done) => {
  const token = req.headers['authorization'].split(' ')[1];
  if (blacklistedTokens.includes(token)) {
    return done(null, true); // token 已经失效
  }
  done();
}

5.退出登录时将 JWT 添加到黑名单中

// 退出登录路由,将 token 加入黑名单
app.post('/logout', (req, res) => {
  if(!req.headers['authorization']) return res.status(401).send({
    code:0,
    msg:'请传入token'
  })
  const token = req.headers['authorization'].split(' ')[1];
  // 添加到黑名单
  blacklistedTokens.push(token);
  res.send({ code:1,msg: '退出登录成功' });
});

完整代码

const express = require('express');
const jwt = require('jsonwebtoken');
const expressJwt = require('express-jwt');
const bodyParser = require('body-parser');

const app = express();
const port = 3000;
// 你的密钥
const secret = 'your_jwt_secret';
// token黑名单
const blacklistedTokens = [];

// 中间件:解析和验证 JWT
const authenticateJwt = expressJwt({
  secret,
  algorithms: ['HS256'],
  isRevoked: (req, payload, done) => {
    const token = req.headers['authorization'].split(' ')[1];
    if (blacklistedTokens.includes(token)) {
      return done(null, true); // token 已经失效
    }
    done();
  }
});

// 使用 body-parser 中间件解析请求体
app.use(bodyParser.urlencoded({ extended: false }));

// 登录路由,生成token并返回
app.post('/login', (req, res) => {
  // 验证用户名和密码
  const { username, password } = req.body;
  // 模拟登录成功,通常是要访问数据库的
  if(username = 'admin' && password = 'admin'){
    const token = jwt.sign({ username }, secret, { expiresIn: '1h' });
    res.send({ code:0,msg: '登录成功',data:token  });
  }else{
    res.status(401).send({ code:0,msg: '账户或密码错误' });
  }
});

// 受保护的路由,需要 token 验证
app.get('/protected', authenticateJwt, (req, res) => {
  res.send({code:1, msg: '这是一个受保护的路由', user: req.user });
});

// 退出登录路由,将 token 加入黑名单
app.post('/logout', (req, res) => {
  if(!req.headers['authorization']) return res.status(401).send({
    code:0,
    msg:'请传入token'
  })
  const token = req.headers['authorization'].split(' ')[1];
  // 添加到黑名单
  blacklistedTokens.push(token);
  res.send({ code:1,msg: '退出登录成功' });
});

// 错误处理
app.use((err, req, res, next) => {
  if (err.name === 'UnauthorizedError') {
    res.status(401).json(code:0,msg:'身份认证失败');
  } else {
    next(err);
  }
});

app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});

标签:const,登录,nodejs,res,req,JWT,接口,token,黑名单
From: https://blog.csdn.net/m0_62442882/article/details/140266736

相关文章

  • nodejs登录成功生成token并验证
    目录1.安装必要的依赖包2.创建Express应用3.生成token4.使用`express-jwt`验证Token5.错误处理在Node.js中,nodejs登录成功生成token并验证通常涉及以下几个步骤:安装必要的依赖包:常用的库包括 `express`用于创建服务器,`jsonwebtoken`用于处理JWT(JSONWebToken),`expr......
  • [NodeJS] NodeJS运行原理简记
    NodeJS的基本组成NodeJS是JavaScript运行时,主要由V8引擎和libuv组成,其中V8使用javascript和c++编写,而libuv是纯c++编写的,二者都是开源的。V8引擎用于将javascript代码转换为计算机可以执行的机器码;而libuv则负责完成异步IO、与操作系统交互(文件系统和网络模块)、事件循......
  • Delphi LDAP对象管理(用户登录认证、组、组织)
    unitlogin;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,uniGUITypes,uniGUIAbstractClasses,uniGUIClasses,uniGUIRegClasses,uniGUIForm,uniButton,uniGUIBaseClasses,uniEdit,REST.Types,uniMemo,REST.Client,......
  • R包:reticulate R对python的接口包
    介绍1R和python是两种不同的编程语言,前者是统计学家发明并且服务数学统计计算,后者则是最万能的胶水语言。随着大数据时代的到来,两者在数据分析领域存在越来越多的共同点且可以相互使用,为了破解二者的编程壁垒,CRAN收录了具有R接口的python包,从而使得两类语言的数据能共同使......
  • PHP转Go系列 | ThinkPHP与Gin框架之API接口签名设计实践
    大家好,我是码农先森。回想起以前用模版渲染数据的岁月,那时都没有API接口开发的概念。PHP服务端和前端HTML、CSS、JS代码混合式开发,也不分前端、后端程序员,大家都是全干工程师。随着前后端分离、移动端开发的兴起,用后端渲染数据的开发方式效率低下,已经不能满足业务对需求快速......
  • Github Copilot登录使用,很稳定的chat,不妨试试
    GithubCopilot代码补全等功能,提高写代码的效率获取地址:https://web.52shizhan.cn/activity/copilot如果之前是激活器激活的,请到环境变量里删除相关的copilot配置。①发你注册的github账号的邮箱或用户名给客服,客服邀请你进入组织时会发送一封邮件到你注册github的邮箱......
  • Apifox 6月更新|定时任务、内网自部署服务器运行接口定时导入、数据库 SSH 隧道连接
    Apifox新版本上线啦!!! 看看本次版本更新主要涵盖的重点内容,有没有你所关注的功能特性:自动化测试支持设置「定时任务」 支持内网自部署服务器运行「定时导入」数据库均支持通过SSH隧道连接自动化测试数据库操作优化 将Apifox更新至最新版,一起开启全新体验......
  • Set接口和常用方法
    基本介绍无序(添加和取出顺序不一致),无索引不允许出现重复元素,因此最多包含一个nulljDKAPI中Set的实现类:Set接口的常用方法和List接口一样,Set接口也是Collection的子接口,因此,常用方法与Collection一样Set接口的遍历方式与Collection一样;但是不能用索引方式来获取。//set......
  • 【Mybatis】(接口式)
    前期准备:一张表(!已经连接数据库!我的数据库叫book,表名为user,有id、name、age三列)项目结构:(log4j可以没有)1,创建一个空的Maven项目然后在pom.xml中导入依赖(mybatis需要3个依赖,junit测试依赖包、mybatis依赖包、SQL连接依赖包)<dependencies><dependency><groupI......
  • vCenter登录失败报500错误:no healthy upstream
    过了个周末登录vCenter的时候提示:HTTP状态500-内部服务器错误;重启服务后提示:nohealthyupstream。如下图:看到这个情况,肯定就是部分不服务异常了或者压根就没有启动。至于说因为啥异常还不得而知。想着登录管理服务(访问端口:5480)重启一下异常服务,结果提示证书过期。问题......