使用token、cookie+session两种方法实现身份验证

token、cookie+session是基于nodejs环境下的模块,可以用来实现身份验证的功能,下面请看具体的实现过程。

token模块实现的思想:

在服务端不需要存储用户的登录记录,全部发给客户端有客户端自己存(cookie,local)
1、客户端使用用户名跟密码请求登录
2、服务端收到请求,去验证用户名与密码
3、验证成功后,服务端会签发一个 Token(加了密的字符串),再把这个 Token 发送给客户端
4、客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5、客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6、服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

//1.引入模块
const express=require('express');
const bodyParser=require('body-parser');
const jwt=require('jsonwebtoken');
//2.创建服务器
let server=express();
//3.监听端口
server.listen(9898,'localhost',function(){console.log('正在监听端口9898...')})
//4.处理请求
//4.1登录请求
server.get('/login',(req,res)=>{
	//(1)获取前端带来的数据和数据库对比,此处代码省略
	//(2)验证登录成功后,生成一个token令牌
	let token=jwt.sign({
		user:req.query.user  //获取前端传来的数据,并记录生成一个token数据
	},
	'wang',  //将token设置一个标识符
	{
		expiresIn:30   //设置的token数据的过期时间
		}
	)
	//(3)传递token数据给前端
	res.send({
		err:0,
		msg:'登录成功,并生成token数据',
		token:token
	})
})
//5.在其他页面判断用户是否登录
server.get('/user',(req,res)=>{
	//(1)获取前端传递来的token数据,包括地址栏数据和非地址栏数据
	let token = req.query.token || req.body.token || req.headers.token;
	//(2)判断是否存在token数据
	jwt.verify(token,"wang",(err,decode)=>{ //err参数代表报错,不报错说明拿到了token
		if(!err){
			res.send({
				err:0,
				msg:'用户已经登录'
			})
		}else{
			res.send('token数据已过期')
		}
	})
})
cookie+session模块实现的思想:

1、客户端用户名跟密码请求登录
2、服务端收到请求,去库验证用户名与密码
3、验证成功后,服务端种一个cookie或发一个字符到客户端,同时服务器保留一份session
4、客户端收到 响应 以后可以把收到的字符存到cookie
5、客户端每次向服务端请求资源的cookie会自动携带
6、服务端收到请求,然后去验证cookie和session,如果验证成功,就向客户端返回请求的库数据

//根目录下命令行输入 npm install cookie-session
//1.引入模块
let express = require("express")
//4.引入cookie-session中间件
let cookieSession = require("cookie-session")

//2.创建服务器
let serve=express()

//4.使用中间件,前端设置一个cookie,后端设置一个session,二者同时生成
serve.use(cookieSession({
	name:'mycookie',  //设置前端的cookie名称
	keys:['a']  ,//加密层级,数组越长,加密等级越高
	// maxAge:1000*10   //cookie的失效时间
}))

//3.监听端口
serve.listen(6767,function(){
	console.log('正在监听端口6767')
})

//4.获取get请求后处理
//4.1登录的处理
serve.get('/login',function(req,res){
	//1.根据前端登录传来的数据,判断用户名和密码是否一致,一致就登录成功,这里省略判断的代码
	//2.假如判断登录时成功的,就进行如下代码操作
	//登录成功的时候,后端将req.session对象上自定义一个属性,用来表示该用户已经登录了,同时,在中间件的作用下,会在前端设置一个叫mycookie的cookie,当二者同时存在,表示在登录的状态
	req.session.login='userid'
	res.send('登录成功了,数据已经保存')
})
//4.2  自动登录处理
serve.get('/user',function(req,res){
	//自动登录就是判断cookie和session数据是否同时存在,如果同时存在,就不用了重新登录了
	let pass = req.session.login;
	if(pass){
		res.send('用户信息存在,不用重复登录')
	}else{
		res.send('用户未登录或登录过期,请重新登录')
	}
	res.end()
})

//4.3 注销登录
serve.get('/logout',function(req,res){
	//删除在后端的session和前端的cookie,也就是将req.session.login的属性值设置为underfined
	req.session.login=undefined;
	res.send('已经注销登录')
})
两种方法实现身份验证的比较
cookie+session token
服务端保存用户信息 ×
避免CSRF攻击 ×
安装性 一般
多服务器粘性问题 存在 不存在
什么是多服务粘性问题?

当在应用中进行 session的读,写或者删除操作时,会有一个文件操作发生在操作系统的temp 文件夹下,至少在第一次时。假设有多台服务器并且 session 在第一台服务上创建。当你再次发送请求并且这个请求落在另一台服务器上,session 信息并不存在并且会获得一个“未认证”的响应。我知道,你可以通过一个粘性 session 解决这个问题。然而,在基于 token 的认证中,这个问题很自然就被解决了。没有粘性 session 的问题,因为在每个发送到服务器的请求中这个请求的 token 都会被拦截。

你可能感兴趣的:(使用token、cookie+session两种方法实现身份验证)