java鉴权_3种常用鉴权方法原理与实现
学生一枚,作为学习和总结。如果有哪些不对的地方,还请指教
cookie
诞生
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。
为解决这个问题,有了cookie出现
cookie介绍
Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),(通知浏览器设置一下cookie),浏览器自动会将Cookie以进行保存(以key/value的形式)。当下次请求同一网站时也会自动发送该Cookie给服务器,即添加在请求头部。
存放在浏览器端
原理即代码实现
const http = require("http")
http.createServer((req, res) => {
// 观察cookie是否存在 如果存在就打印cookie
console.log('cookie:', req.headers.cookie)
// 设置cookie
res.setHeader('Set-Cookie', 'cookie=abc;')
res.end('hello cookie!!')
}).listen(3000)
复制代码
结果展示
为什么会有两次?
第一次 请求的时候 发现没有cookie,就进行了设置
第二次请求,发现有cookie了,就直接输出了
session
基于cookie 实现,存放在服务端
里面只存一个cookieId,其他的保存在服务器中
代码即原理展示
// principle
const http = require("http")
const session = {} // 用来存放cookie
http.createServer((req, res) => {
// 观察cookie存在
console.log('cookie:', req.headers.cookie)
const sessionKey = 'sid'
const cookie = req.headers.cookie
if (cookie && cookie.indexOf(sessionKey) > -1) { // 证明cookie 存在
res.end('Come Back ')
// 简略写法未必具有通用性
const pattern = new RegExp(`${sessionKey}=([^;]+);?\s*`) // 正则表达式对象 判断是否又sid = XX等
console.log(pattern)
const sid = pattern.exec(cookie)[1] // 检索字符串中指定的值。返回找到的值
console.log('session:', sid, session, session[sid])
} else {
const sid = (Math.random() * 99999999).toFixed()
// 设置cookie
res.setHeader('Set-Cookie', `${sessionKey}=${sid};`)
session[sid] = {name: 'oldWang'}
res.end('Hello')
}
res.end('hello cookie!!')
}).listen(3000)
复制代码
分析
浏览器不存在cookie 的时候,走else,随机设置一个sid,(一般是自己设置,尽量麻烦一点),然后 设置cookie, 在session集合中保存用户信息,(一般存到数据库里面), 最后返回结果
第二次进入的时候,会走if ,进行取值判断。
Token
使用原因
Session不足,服务器存在状态
不灵活,(cookie只存在于浏览器)
过程
客户端使用户名跟密码请求登录
服务端收到请求,去验证用户名与密码
验证成功后,服务端会签发一个令牌(Token),再把这个 Token 发送给客户端
客户端收到 Token 以后可以把它存储起来,⽐比如放在 Cookie 里或者 Local Storage ⾥
客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回 请求的数据
例子实现
前台
Title
登陆
退出
获取用户
清除页面
- {{ log }}
axios.defaults.baseURL = 'http://localhost:3000'
axios.defaults.withCredentials = true
axios.interceptors.request.use(config => {
const token = window.localStorage.getItem("token");
if (token) {
// 判断是否存在token,如果存在的话,则每个http header都加上token
// Bearer是JWT的认证头部信息
config.headers.common["Authorization"] = "Bearer " + token;
}
return config;
}, err => {
return Promise.reject(err);
});
axios.interceptors.response.use(response => {
app.logs.push(JSON.stringify(response.data));
return response;
}, err => {
app.logs.push(JSON.stringify(response.data));
return Promise.reject(err);
});
var app = new Vue({
el: "#app",
data: {
username: "admin",
password: "admin",
logs: []
},
methods: {
login: async function () {
const res = await axios.post("/users/login-token", {
username: this.username,
password: this.password
});
localStorage.setItem("token", res.data.token);
}, logout: async function () {
this.logs.push('退出登陆')
localStorage.removeItem("token");
}, getUser: async function () {
await axios.get("/users/getUser-token");
}
}
});
复制代码
后台代码
const Koa = require('koa')
const router = require('koa-router')() // koa路由
const jwt = require("jsonwebtoken")
const jwtAuth = require("koa-jwt")
const secret = "it's a secret"
const cors = require('koa2-cors')
// https://www.jb51.net/article/135924.htm 跨域参考
const bodyParser = require('koa-bodyparser') // 不支持table,支持json
const static = require('koa-static')
const app = new Koa();
app.keys = ['some secret'];
app.use(cors({credentials: true})) // 解决跨域
app.use(static(__dirname + '/'));
app.use(bodyParser())
router.post("/users/login-token", async ctx => {
const {body} = ctx.request;
console.log(body)
//登录逻辑,略略
// 设置session
const userinfo = body.username;
ctx.body = {
message: "登录成功", user: userinfo,
// ⽣生成 token 返回给客户端
token: jwt.sign({
data: userinfo,
// 设置 token 过期时间,一⼩小时后,秒为单位
exp: Math.floor(Date.now() / 1000) + 60 * 60
}, secret)
};
})
router.get("/users/getUser-token", jwtAuth({secret}), async ctx => {
// 验证通过,state.user
console.log(ctx.state.user);
//获取session
ctx.body = {message: "获取数据成功", userinfo: ctx.state.user.data};
});
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);
复制代码
jsonwebtoken github
关于找一找教程网
本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[3种常用鉴权方法原理与实现]http://www.zyiz.net/tech/detail-129918.html
java鉴权_3种常用鉴权方法原理与实现相关推荐
- 五种常用异常值检测方法
Toggle navigation 首页 产业趋势 专家观察 CISO洞察 决策研究 登录 APP下载 数据挖掘最前线:五种常用异常值检测方法 安全运营 机器之心 2019-07-05 通过鉴别故障来 ...
- 结合Scikit-learn介绍几种常用的特征选择方法
特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...
- 异常数据4种剔除方法_数据分析系列 22/32 | 9种常用的数据分析方法
要使各种结构化的.非结构化的.海量的数据实现标准化.信息化,能够提供业务绩效评估.业务决策支持等要求,我们首先需要进行数据分析. 同时,围绕业务问题,采用合适的分析方法,分析模型,以及分析工具,这是数 ...
- python 卡方检验 特征选择_结合Scikit-learn介绍几种常用的特征选择方法
特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点.底层结构,这对进一步改善模型.算法都有着重要作用. 特征选择主要有两个功能: 减 ...
- 几种常用的优化方法梯度下降法、牛顿法、)
几种常用的优化方法 1. 前言 熟悉机器学习的童鞋都知道,优化方法 ...
- (转)几种常用存储过程分页方法
我们先给出几种主要的分页方法和核心语句,然后直接给出结论,有兴趣的读者可以看看后面的数据 几种常用存储过程分页方法 TopN方法 select Top(@PageSize) from TableNam ...
- 功能测试常用6种方法_16种常用的数据分析方法聚类分析
聚类(Clustering)就是一种寻找数据之间内在结构的技术.聚类把全体数据实例组织成一些相似组,而这些相似组被称作簇.处于相同簇中的数据实例彼此相同,处于不同簇中的实例彼此不同. 聚类分析定义 聚 ...
- lasso特征选择python_转:结合Scikit-learn介绍几种常用的特征选择方法-2
4.2 平均精确率减少 Mean decrease accuracy 另一种常用的特征选择方法就是直接度量每个特征对模型精确率的影响.主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率 ...
- 干货:结合Scikit-learn介绍几种常用的特征选择方法
原文:http://dataunion.org/14072.html 作者:Edwin Jarvis 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮 ...
最新文章
- python3.0视频教程_python中文视频教程(全38集),全套视频教程学习资料通过百度云网盘下载...
- linux释放内存命令
- Flume-NG源码阅读之SourceRunner,及选择器selector和拦截器interceptor的执行
- 郑州网络推广浅谈网站首页在优化时都需要注意哪些细节呢?
- Linux字符设备与块设备的区别与比较
- 数据智能知多少?(超大礼包等你拿)
- Bootstrap+DataTables后端排序分页详解
- 谷歌修复安卓System 组件中的多个 RCE 漏洞
- 如何提升鸿蒙战绩,蛰伏一年 鸿蒙系统2.0为我们带来了哪些升级?
- 鸿蒙推送荣耀,华为鸿蒙首批推送机型8款,荣耀“避嫌”,不在首批名单
- 距离Java开发者玩转 Serverless,到底还有多远?
- Tomcat安装与配置教程(图文教学)
- 任何共享软件作者都能挣到一年10万美金以上的收入,只要他想的话
- Pr入门系列之三:新建序列
- 一些大任务SQL的优化方案
- SRVCC B1,B2事件总结
- Javascript解决音频audio在IOS系统下无法播放问题
- 微信小程序--搜索框样式 及form提交实现
- 5个APP,4220个数据,回顾Yura的2018年
- 如何开展一次成功的海外KOL营销活动?
热门文章
- wlan 扩展频谱(Spread Spectrum)技术 DSSS VS FHSS
- CTF--[网鼎杯 2020 青龙组]AreUSerialz
- 重磅!“集成电路”正式成为一级学科!
- flex 联机游戏开发 - 四国军棋游戏:(一)引子
- 阿里云云效-Maven公共仓库
- android游戏手柄怎么用,王者荣耀游戏手柄怎么设置 安卓手机用手柄玩需要先root吗...
- 快速搭建Cocos2dx for MAC开发环境
- 【MySQL 17】安装异常:Could not open file ‘/var/log/mysql/mysqld.log‘ for error logging: Permission denied
- 西门子滚筒洗衣机教程_西门子滚筒洗衣机图解
- pipenv与虚拟环境