node使用JsonWebToken 生成token,完成用户登录、登录检测
最近在用node做后台的登录,检测登录功能。在本地使用session可以成功,但是放服务器后发现session失效了,每次请求session都会变化,着了很久原因。原来,自己项目是前后端分离的,前端调用后端api接口,因此使用
cors = require('cors')来解决了跨域问题,而跨域对于cookie来说,就是两个不同的网站,因此session会不停的变。
起因
最近在用node做后台的登录,检测登录功能。在本地使用session可以成功,但是放服务器后发现session失效了,每次请求session都会变化,着了很久原因。原来,自己项目是前后端分离的,前端调用后端api接口,因此使用cors = require('cors')来解决了跨域问题,而跨域对于cookie来说,就是两个不同的网站,因此session会不停的变。
解决方法
- 设置一个nginx或者什么别的来做一下转发,避免跨域。可以弄一个nginx,设置8080,然后app指向3000,api指向1994。
- 不使用session,而使用token来做api请求
使用token
- 导入模块
npm install jsonwebtoken - 后台生成token并存入数据库里
//api.js
//登录
router.post('/api/admin/signIn',(req, res)=>{
db.User.find({ name: req.body.name,password: req.body.password},(err, docs)=>{
if (err) {
res.send(err);
return
}
if(docs.length>0){
let content ={name:req.body.name}; // 要生成token的主题信息
let secretOrPrivateKey="suiyi" // 这是加密的key(密钥)
let token = jwt.sign(content, secretOrPrivateKey, {
expiresIn: 60*60*1 // 1小时过期
});
docs[0].token = token //token写入数据库
db.User(docs[0]).save(function (err) {
if (err) {
res.status(500).send()
return
}
res.send({'status':1,'msg':'登陆成功','token':token,'user_name':req.body.name}) //反给前台
})
}else{
res.send({'status':0,'msg':'登录失败'});
}
})
})
- 前台就可以获得token并存入localStorage了
//signin.vue
this.$axios.post(webUrl+'api/admin/signIn', {'name': this.name, 'password': this.password})
.then((response) => {
if(response.data.status==1){
localStorage.setItem('token', response.data.token);
localStorage.setItem('user_name', response.data.user_name);
}else{
alert(response.data.msg)
}
})
.catch((reject) => {
console.log(reject)
})
- 后台检测token
//检测token
//api.js
router.post('/api/admin/checkUser',(req, res)=>{
db.User.find({ name: req.body.user_name,token: req.body.token},(err, docs)=>{
if (err) {
res.send(err);
return
}
if(docs.length>0){
let token = req.body.token; // 从body中获取token
let secretOrPrivateKey="suiyi"; // 这是加密的key(密钥)
jwt.verify(token, secretOrPrivateKey, function (err, decode) {
if (err) { // 时间失效的时候/ 伪造的token
res.send({'status':0});
} else {
res.send({'status':1});
}
})
}else{
res.send({'status':0});
}
})
})
- 前台每次调用checkUser来检测登录就可以了,也可以每个接口都传token,后台验证;
最后
大家好,这里是「 TaoLand 」,这个博客主要用于记录一个菜鸟程序猿的Growth之路。这也是自己第一次做博客,希望和大家多多交流,一起成长!文章将会在下列地址同步更新……
个人博客:www.yangyuetao.cn
小程序:TaoLand
node使用JsonWebToken 生成token,完成用户登录、登录检测的更多相关文章
- 使用JWT登录生成token
package com.example.demo.util; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import co ...
- 国服最强JWT生成Token做登录校验讲解,看完保证你学会!
转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...
- JAVAEE——宜立方商城11:sso登录注册功能实现、通过token获得用户信息、Ajax跨域请求(jsonp)
1. 学习计划 第十一天: 1.sso注册功能实现 2.sso登录功能实现 3.通过token获得用户信息 4.Ajax跨域请求(jsonp) 2. Sso系统工程搭建 需要创建一个sso服务工程,可 ...
- (html)前端如何验证token的合法性来判断用户是否登录?
问题: (html)前端如何验证token的合法性来判断用户是否登录?描述: 1.我使用了JWT的方式,后端生成了一个token,将其返回给前端,前端获取到后每次请求接口都附带上这个token,后端来 ...
- Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)
上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...
- Node教程——封装一个token验证器
重要说明 这个轮子是 使用 express@5.0 + MongoDB构建起来的一个 node后台通用的验证器,里面主要讲的就是使用jwt,token进行验证,当然你想使用session也没问题,但是 ...
- Spring Boot + Security + JWT 实现Token验证+多Provider——登录系统
首先呢就是需求: 1.账号.密码进行第一次登录,获得token,之后的每次请求都在请求头里加上这个token就不用带账号.密码或是session了. 2.用户有两种类型,具体表现在数据库中存用户信息时 ...
- Java生鲜电商平台-Java后端生成Token架构与设计详解
Java生鲜电商平台-Java后端生成Token架构与设计详解 目的:Java开源生鲜电商平台-Java后端生成Token目的是为了用于校验客户端,防止重复提交. 技术选型:用开源的JWT架构. 1. ...
- tp5用户id登录进行权限设置
HTML代码:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
随机推荐
- HDU 5934 Bomb(tarjan/SCC缩点)题解
思路:建一个有向图,指向能引爆对象,把强连通分量缩成一点,只要点燃图中入度为0的点即可.因为入度为0没人能引爆,不为0可以由别人引爆. 思路很简单,但是早上写的一直错,改了半天了,推倒重来才过了... ...
- LA 3268 号码簿分组(最大流+二分)
https://vjudge.net/problem/UVALive-3268 题意: 有n个人和m个组.一个人可能属于很多组.现在请你从某些组中去掉几个人,使得每个人只属于一个组,并使得人数最多的组 ...
- POJ 3281 Dining(最大流)
http://poj.org/problem?id=3281 题意: 有n头牛,F种食物和D种饮料,每头牛都有自己喜欢的食物和饮料,每种食物和饮料只能给一头牛,每头牛需要1食物和1饮料.问最多能满足几 ...
- python 返回列表中的偶数
def is_even_num(l): enum = [] for n in l: == : enum.append(n) return enum print(is_even_num([, , , , ...
- Singleton(单例)
意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代 ...
- Angular i18n
Angular2中使用ngx-translate进行国际化http://blog.csdn.net/u014291497/article/details/61233033 在 Angular 项目中添 ...
- 秒转为时分秒格式js
秒转为时分秒格式 function formatSeconds(value) { if(value == undefined) { value = 0; } var second = parseInt ...
- LINUX QQ
查询龙井QQ http://www.longene.org/forum/viewtopic.php?f=6&t=4700
- IOS-组件化架构漫谈
本文作者: 伯乐在线 - 刘小壮 .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 前段时间公司项目打算重构,准确来说应该是按之前的产品逻辑重写一个项目
- IOS-高仿bilibili项目
高仿bilibili项目成长之路 (logo) 高仿bilibili项目 Github链接:(https://github.com/MichaelHuyp/Bilibili_Wuxianda) 目前完 ...