最近在用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,完成用户登录、登录检测的更多相关文章

  1. 使用JWT登录生成token

    package com.example.demo.util; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import co ...

  2. 国服最强JWT生成Token做登录校验讲解,看完保证你学会!

    转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...

  3. JAVAEE——宜立方商城11:sso登录注册功能实现、通过token获得用户信息、Ajax跨域请求(jsonp)

    1. 学习计划 第十一天: 1.sso注册功能实现 2.sso登录功能实现 3.通过token获得用户信息 4.Ajax跨域请求(jsonp) 2. Sso系统工程搭建 需要创建一个sso服务工程,可 ...

  4. (html)前端如何验证token的合法性来判断用户是否登录?

    问题: (html)前端如何验证token的合法性来判断用户是否登录?描述: 1.我使用了JWT的方式,后端生成了一个token,将其返回给前端,前端获取到后每次请求接口都附带上这个token,后端来 ...

  5. Spring Cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)

    上一篇我根据框架中OAuth2.0的使用总结,画了SSO单点登录之OAuth2.0 登出流程,今天我们看一下根据用户token获取yoghurt信息的流程: /** * 根据token获取用户信息 * ...

  6. Node教程——封装一个token验证器

    重要说明 这个轮子是 使用 express@5.0 + MongoDB构建起来的一个 node后台通用的验证器,里面主要讲的就是使用jwt,token进行验证,当然你想使用session也没问题,但是 ...

  7. Spring Boot + Security + JWT 实现Token验证+多Provider——登录系统

    首先呢就是需求: 1.账号.密码进行第一次登录,获得token,之后的每次请求都在请求头里加上这个token就不用带账号.密码或是session了. 2.用户有两种类型,具体表现在数据库中存用户信息时 ...

  8. Java生鲜电商平台-Java后端生成Token架构与设计详解

    Java生鲜电商平台-Java后端生成Token架构与设计详解 目的:Java开源生鲜电商平台-Java后端生成Token目的是为了用于校验客户端,防止重复提交. 技术选型:用开源的JWT架构. 1. ...

  9. tp5用户id登录进行权限设置

    HTML代码:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

随机推荐

  1. InstallShield 2015 LimitedEdition VS2012 运行bat文件

    转载:http://www.cnblogs.com/fengwenit/p/4271150.html  运行bat文件 网上很多介绍如何运行bat的方法,但我这个是limted 版本,不适用. 1. ...

  2. SprigBoot核心技术

    启动原理 运行流程 自动配置原理 一.启动原理 SpringApplication.run(主程序类)– new SpringApplication(主程序类)• 判断是否web应用• 加载并保存所有 ...

  3. UVa 10328 Coin Toss(Java大数+递推)

    https://vjudge.net/problem/UVA-10328 题意: 有H和T两个字符,现在要排成n位的字符串,求至少有k个字符连续的方案数. 思路:这道题目和ZOJ3747是差不多的,具 ...

  4. PHP如何生成文章预览图

    PHP如何生成文章预览图 一.总结 一句话总结:php的wkhtmltox扩展,php官方文档有怎么使用,或者github,或者百度,等等等等 wkhtmltox 1.PHP如何自动生成文章预览图? ...

  5. C#通过WMI读取MAC地址

    该方法依赖WMI的系统服务,该服务一般不会被关闭;但如果系统服务缺失或者出现问题,该方法无法取得MAC地址,需要重启Windows Management Instrumentation服务. publ ...

  6. django使用bootstrap快速美化 admin后台

    使用django-admin-bootstrappe快速美化后台 两步: 1.pip install django-admin-bootstrapped  安装应用 2.在setting.py里面添加 ...

  7. C#使用(NamedPipe)命名管道通信的例子

    https://blog.csdn.net/yl2isoft/article/details/20228279

  8. JS 取出DataGrid 列

    var dt = document.all.<%= dgList.ClientID %>//找到你的grid在客户端的table for(var i = 1; i < dt.rows ...

  9. jquery MD5

    /** * jQuery MD5 hash algorithm function * * <code> * Calculate the md5 hash of a String * Str ...

  10. vue.js 源代码学习笔记 ----- decoder

    /* @flow */ let decoder export function decode (html: string): string { decoder = decoder || documen ...