node使用jsonwebtoken生成token与验证是否过期
场景
我们可以使用 cookie,session,token 来做鉴权。
下面我们来看一下,
如何使用 token 来做鉴权
jwt.sign 的简单介绍
npm install jsonwebtoken 下载
使用 jsonwebtoken 生成token的基本语法。
jwt.sign(payload, secretOrPrivateKey, [options, callback])
第1个参数 payload:可以是表示有效 JSON 的对象文本、缓冲区,字符串。
需要注意的是:如果不是缓冲区或字符串,使用 JSON.stringify
下面我们使用对象文本,就不需要使用 JSON.stringify。
第2个参数 secretOrPrivateKey: 是一个字符串(utf-8编码)、缓冲区、对象。
就是说是加密数据。
options:包含的其他选项,如过期时间,
它的选项有:expiresIn 过期时间,如果是数字,单位就是秒。
algorithm: HS256 (默认的算法)
callback:回调函数,包含返回来的错误
使用 jsonwebtoken 生成token
// 生成的token。 expiresIn 数值单位默认是秒s
//expiresIn也可以添加为 expiresIn:'10h' | '10d'
let createToken = jwt.sign({
data: 'jiamideshuju'
}, 'lingpai', { expiresIn: 3 });
// expiresIn: 3 表示的是有效时间是3s。
console.log('生成的token', createToken)

查看生成的token是否过期
// 生成的token。
let createToken = jwt.sign({
data: 'jiamideshuju'
}, 'lingpai', { expiresIn: 3 });
console.log('生成的token', createToken)
setTimeout(()=>{
// 查看token是否过期
var decoded = jwt.verify(createToken, 'lingpai')
console.log('4s后token是否过期', decoded)
},4000)

封装生成token与验证token是否过期
utils/createTokenCheck.js文件
// 引入 jsonwebtoken
let jwt = require('jsonwebtoken');
let lingpai = 'weislingpai'
const createTokenCheck = {
// 生成的token。并设置过期时间
getToken(jiamiData,expiresIn=3){
return jwt.sign({
data: jiamiData
}, lingpai, { expiresIn: expiresIn })
},
// 检查token是否过期
verify(token){
try {
return jwt.verify(token, lingpai)
} catch (error) {
// 如果报错返回false.[因为token有可能过期,就会报错]
console.log('error:', error)
return false
}
}
}
// 暴露出去,其他地方调用就行
module.exports = createTokenCheck
app.js文件调用
const createTokenCheck =require('./utils/createTokenCheck')
let token= createTokenCheck.getToken('zhangsan',2)
console.log('不会过期', token)
setTimeout(() => {
let data=createTokenCheck.verify(token)
console.log('过期返回false', data)
}, 3000);

登录验证
前端代码
<template>
<div>
<h2>登录页</h2>
<form action="">
用户名:<input type="text" v-model="userInfo.user"> <br>
密 码:<input type="password" v-model="userInfo.password"><br>
<button @click="handlerLogin">登录</button>
</form>
</div>
</template>
<script setup lang="ts">
import {reactive} from 'vue'
import axios from 'axios'
const userInfo = reactive({
user:'',
password:''
})
const handlerLogin=()=>{
axios.post('http://127.0.0.1:3000/login', {
user:userInfo.user,
password: userInfo.password,
}).then(res => {
console.log(res);
}).catch(error => {
console.log(error);
});
}
</script>
app.js
app.post('/login', function(req, res) {
console.log('req', req.body)
//通过req.body接收传递的参数
let { user, password } = req.body
// 我们假设用户是这样就会成功
if(user==='zhangsan'&& password==='123'){
// 生成token 过期时间设置为10s
let token= createTokenCheck.getToken('zhangsan',10)
// 发送token
res.send({
code: 'ok',
msg:'登录成功',
token:token
});
}else{
res.send({
code: 'fail',
msg: '登录失败',
});
}
})


无法加载响应数据: No data found for resource with given identifier
我们现在需要下载 cors
npm i cors
然后在app.js中引入
const cors = require('cors')
// 放置在路由的前面
app.use(cors())
'req.body' as it is undefined.
//放置在路由的前面
app.use(express.json());

前端接口携带token
携带token
<template>
<div>
<h1 class="h1">我是test文件</h1>
</div>
</template>
<script setup lang="ts">
import axios from 'axios'
const handlerLogin=()=>{
axios.post('http://127.0.0.1:3000/list',{},{
headers:{
authorization: localStorage.getItem('token')
}
}).then(res => {
console.log(res)
console.log(res);
}).catch(error => {
console.log(error);
});
}
handlerLogin()
</script>
aap.js代码
const createTokenCheck =require('./utils/createTokenCheck')
// 处理跨域
const cors = require('cors')
const express = require('express')
const app = express()
app.use(cors())
// 处理 'req.body' as it is undefined.
app.use(express.json());
const port = 3000
app.get('/', (req, res) => res.send('Hello World!'))
app.post('/login', function(req, res) {
console.log('req', req.body)
//通过req.body接收传递的参数
let { user, password } = req.body
// 我们假设用户是这样就会成功
if(user==='zhangsan'&& password==='123'){
// 生成token 过期时间设置为10s
let token= createTokenCheck.getToken('zhangsan',10)
// 发送token
res.send({
code: 'ok',
msg:'登录成功',
token:token
});
}else{
res.send({
code: 'fail',
msg: '登录失败',
});
}
})
app.post('/list', (req, res) =>{
let getToken = (req.headers && req.headers.authorization) || ''
if(getToken){
// 检查token是否过期
if(createTokenCheck.verify(getToken)){
res.send({
code: 'ok',
list: [
{name:'张三',grade:98, status:'通过考试'},
{name:'李四',grade:58, status:'未通过考试'},
{name:'王五',grade:78, status:'通过考试'}
]
});
}else{
res.send({
code: 'fail',
list: [],
msg:'token过期'
});
}
}else{
res.send({
code: 'fail',
list: [],
msg:'请携带token'
});
}
})
app.listen(port, () => console.log(`Example app listening on port ${port}!`))


node使用jsonwebtoken生成token与验证是否过期的更多相关文章
- node使用JsonWebToken 生成token,完成用户登录、登录检测
最近在用node做后台的登录,检测登录功能.在本地使用session可以成功,但是放服务器后发现session失效了,每次请求session都会变化,着了很久原因.原来,自己项目是前后端分离的,前端调 ...
- Python itsdangerous 生成token和验证token
代码如下 class AuthToken(object): # 用于处理token信息流程: # 1.更加给定的用户信息生成token # 2.保存生成的token,以便于后面验证 # 3.对用户请求 ...
- 国服最强JWT生成Token做登录校验讲解,看完保证你学会!
转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...
- Node教程——封装一个token验证器
重要说明 这个轮子是 使用 express@5.0 + MongoDB构建起来的一个 node后台通用的验证器,里面主要讲的就是使用jwt,token进行验证,当然你想使用session也没问题,但是 ...
- python 数据加密以及生成token和token验证
代码如下: # -*- coding: utf-8 -*- from passlib.apps import custom_app_context as pwd_context import conf ...
- 【Python】Django【邮箱验证】 后端验证如何生成 token加密验证码 与如何解码!!!!
1.生成token验证码方案 ,使用itsdangerous 大宝剑, 可以序列化出验证码,并能设置过期时间 安装 itsdangerous pip install itsdangerous ...
- .netcore2.1 使用IdentityServer4 生成Token验证
每个新技术权限验证都有一套机制,之前项目WebApi接口权限验证用的是Owin做为权限验证,而.netcore权限限制使用的是IdentityServer4,采用JWT的方法验证token. 首先使用 ...
- 利用jwt生成token,用于http请求身份验证
前段时间在做移动端接口过程中,考虑到安全性,所有移动端发送请求(除了登录请求)过程中进行token有效验证. 1.利用jwt生成token a.导入jwt相关包 <!-- jwt --> ...
- session-cookie 和token登录验证
最近研究了下基于token的身份验证,并将这种机制整合在个人项目中.现在很多网站的认证方式都从传统的seesion+cookie转向token校验.对比传统的校验方式,token确实有更好的扩展性与安 ...
- Vue和Node.js交互之token
博主最近工作的时候,公司后台使用的JAVA,在做登陆时总会传来一个token然后我存在了本地存储中或Vuex中,之后每一次请求把它带在请求头上,然后就好奇想要自己做一个后台服务器然后做一个完整的登陆的 ...
随机推荐
- Nordic nRF52系列/nRF5340硬件设计(一)选型及原理图设计
Nordic 的BLE系列芯片从第一代的nRF51系列,到第二代的nRF52系列,发展到目前最新的第三代的nRF5340.目前市场中使用最多的nRF52系列一共有七款芯片,它们是:nRF52805.n ...
- day49:django:wsgrief&模板渲染Jinjia2&django的MTV/MVC框架&创建/启动一个django项目
目录 1.自定义web框架wsgiref版 2.自定义web框架wsgiref版-优化版 3.模板渲染JinJa2 4.MTV和MVC框架 5.django:下载安装&创建启动 自定义web框 ...
- 【前端基础】(二)promise异步编排
☆promise异步编排 javascript众所周知只能支持单线程,因此各种网络请求必须异步发送,导致可能会出现很多问题,比如如下我们有三个文件,现在要求进行如下请求: ① 查出当前用户信息 ② 根 ...
- hackathon 复盘:niche 海外软件工具正确的方法 6 个步骤
上周末,去参加了北京思否 hackathon,两天时间内从脑暴 & 挖掘软件 IDEA -> Demo 研发路演,这次经历让我难忘.这里我的看法是每个开发者圈友,都应该去参加一次 hac ...
- 前端获取不到环境变量NODE_ENV
有时候我们期望通过执行不同的 npm script 来区分诸如 dev.prod.uat.sit等多环境下使用的不同变量 今天我也在整环境变量,碰到一个小小的bug.装了 cross-env 但还是没 ...
- win系统安装wordcloud报错解决方案
问题: ① 在命令行下执行pip install wordcloud出现报错如图: ②下载了错误的whl文件, 出现wordcloud-1.4.1-cp27-cp27m-win_amd64.whl i ...
- 一天吃透SpringBoot面试八股文
Springboot的优点 内置servlet容器,不需要在服务器部署 tomcat.只需要将项目打成 jar 包,使用 java -jar xxx.jar一键式启动项目 SpringBoot提供了s ...
- StringBuilder类用法解析
一.StringBuilder说明 StringBuilder是一个可变的字符序列.这个类提供了一个与StringBuffer兼容的API,但不保证同步,即StringBuilder不是线程安全的,而 ...
- Web进阶LNMP网站部署
Web进阶LNMP网站部署 目录 Web进阶LNMP网站部署 LNMP架构工作流程 部署LNMP架构 1.安装nginx 2.安装php 3.安装数据库 将Nginx和PHP建立连接 1.修改ngin ...
- OData WebAPI实践-OData与EDM
本文属于 OData 系列 引言 在 OData 中,EDM(Entity Data Model) 代表"实体数据模型",它是一种用于表示 Web API 中的结构化数据的格式.E ...