单页应用 - Token 验证
单页应用 - Token 验证
转:https://juejin.im/post/58da720b570c350058ecd40f
第一次接触单页应用,记录公司项目关于Token验证知识.
Token的工作原理
Token工作原理
1. 登录时候,客户端通过用户名与密码请求登录
2. 服务端收到请求区验证用户名与密码
3. 验证通过,服务端会签发一个Token,再把这个Token发给客户端.
4. 客户端收到Token,存储到本地,如Cookie,SessionStorage,LocalStorage.我们是存在SessionStorage
5. 客户端每次像服务器请求API接口时候,都要带上Token.
6. 服务端收到请求,验证Token,如果通过就返回数据,否则提示报错信息.复制代码
这里还涉及到一些前端登录拦截(路由拦截,拦截器).
- 路由拦截
// 登录路由设置个字段,用来记录是否已经登录
path: '/login', name:'login',
component: resolve => require(['./login.vue'], resolve),
meta: { noCheckSession: true }复制代码
// 路由拦截
router.beforeEach((to, from, next) => {
if(to.matched.some(record => !record.meta.noCheckSession)) {
let isLogin = auth.checkAuth() //我们登录成功后会设置个字段(authenticated)为true.这里就是获取那个字段.
if(!isLogin){
console.error('Place login!')
next({
path: '/login',
query: { redirect: to.fullPath } // 跳转到登录页面
})
}else{
next()
}
}else{
next()
}
}复制代码
- 拦截器
export const interceptor = function(Vue){
Vue.http.interceptors.push((request, next)=>{
let tokenVal = sessionStorage.getItem("token"); // 取出Tolen
if(tokenVal) {
request.headers['token'] = tokenVal // 存在的话,把Token放在请求头中
}
next((response)=>{
let status = response.status
let data = response.data
try{
if(typeof data === 'string'){
data = JSON.parse(data)
}
}catch(e){
}
let isError = false
let duration = 0
let options = {
message: ""
}
if(status === 401 ) {
location.href = '/login' // 401未授权,重新登录
}else if (status === 500){
isError = true
options.message = response.statusText
options.description = response.data
Message.error(options) // 调用全局组件提示
location.href = '/login'
}else if (status === 200){
// custom error
if (response.data['<isError>']){
...
}
//timeout
else if(data.data && data.data['ecode'] === "401"){
....
}
}
});
});
}复制代码
auth0.com/blog/ten-th…关于Token,你需要知道的十件事.
Token 应该被保存起来,放到 local / session stograge 或者 cookies.
1. 在单页应用程序中,有些用户刷新浏览器后会带来一些跟 token 相关的问题。而解决方法很简单:你应该把 token 保存到起来:放到 session storage, local storage 或者是客户端的 cookie 里。而浏览器不支持 session storage 时都应该转存到 Cookies 里。
2. 存放在Cookie里面,只是把 Cookie 当作一个储存机制,而不是一种验证机制,这个 cookie 不会被 Web 框架用于用户验证,所以没有 XSRF 攻击的危险。复制代码- Tokens像 cookie 一样有有效期,你可以有更多的操作方法
// Cookie的有效期操作
1. cookies 可以在浏览器关闭后删除(session cookies);
2. 通过绝对有效期或弹性有效期(sliding window expiration);
3. Cookies 可以通过携带有有效期地保存起来。复制代码
//一旦 token 过期,只需要重新获取一个。我们一般定义个可以接口去刷新 token
1. 让旧的 token 失效;
2. 检查这个用户是不是还存在,权限是否被取消或者任何对你的程序来说是有必要的;
3. 得到一个更新了有效期的 token。复制代码
Local / session storage 不会跨域工作,请使用一个标记 cookie
1. sessionStorage 不能跨页面共享的,关闭窗口即被清除,
2. localStorage 可以同域共享,并且是持久化存储的
3. 在 local / session storage 的 tokens,就不能从不同的域名中读取,甚至是子域名也不行.
解决办法使用Cookie.demo: 假设当用户通过 app.yourdomain.com 上面的验证时你生成一个 token 并且作为一个 cookie 保存到 .yourdomain.com,然后,在 youromdain.com 中你可以检查这个 cookie 是不是已经存在了,并且如果存在的话就转到 app.youromdain.com去。这个 token 将会对程序的子域名以及之后通常的流程都有效(直到这个 token 超过有效期)
只是利用cookie的特性进行存储而非验证.复制代码每个 CORS(跨域资源共享)请求都会带上预请求(Preflight request)
当你需要流传送某些东西,请用 token 去获取一个已签名的请求。
- XSS 比 XSRF 要更容易防范
XSS 攻击的原理是,攻击者插入一段可执行的 JavaScripts 脚本,该脚本会读出用户浏览器的 cookies 并将它传输给攻击者,攻击者得到用户的 Cookies 后,即可冒充用户。
但是要防范 XSS 也很简单,在写入 cookies 时,将 HttpOnly 设置为 true,客户端 JavaScripts 就无法读取该 cookies 的值,就可以有效防范 XSS 攻击。
因为 Tokens 也是储存在本地的 session storage 或者是客户端的 cookies 中,也是会受到 XSS 攻击。所以在使用 tokens 的时候,必须要考虑过期机制,不然攻击者就可以永久持有受害用户帐号。复制代码
注意 token 的大小
1. Token 机制在每次请求 API 的时候,都需要带上一个 Authorization 的 Http Header 。
2. Token 的大小其实由你储存在 token 中的信息量所决定,例如可能有 nickname,openid 等开发者另外加上的信息。
3. Token 中只保留关键的几条身份标识信息,其余都放到数据库里面了,权限控制的时候再捞出。这样做的好处是,开发者可以完全掌控 token,因为关键信息都已经是你代码和数据库中的一部分了,想怎么弄都可以了
4. # Token
GET /foo
Authorization: Bearer ...2kb token...复制代码- 有需要的话,要加密并且签名 token
- 将 JSON Web Tokens 应用到 OAuth 2,关于OAuth验证阮一峰大神博客有.
- Tokens 不是万能的解决方法,得根据你的需求自行采用
ps : 有些地方还是不懂,慢慢学.
单页应用 - Token 验证的更多相关文章
- 从零搭建一个IdentityServer——单页应用身份验证
上一篇文章我们介绍了Asp.net core中身份验证的相关内容,并通过下图描述了身份验证及授权的流程: 注:改流程图进行过修改,第三方用户名密码登陆后并不是直接获得code/id_token/acc ...
- Ionic3的http请求如何实现token验证,并且超时返回登录页
要求 后台提供的接口,不能让人随便输入个链接就能访问,而是要加入一个token,token是动态的,每次访问的时候判断,有权限并且未过期的时候才可以访问接口. 后台的设计是 在登录的时候,首先要pos ...
- 8-网页,网站,微信公众号基础入门(使用Python程序实现微信token验证)
https://www.cnblogs.com/yangfengwu/p/11062034.html 设置一下IP白名单: 填写自己的服务器的IP地址 是不是不可以哈,有多少人都会入这个坑.... ...
- [译]用AngularJS构建大型ASP.NET单页应用(二)
原文地址:http://www.codeproject.com/Articles/808213/Developing-a-Large-Scale-Application-with-a-Single 客 ...
- React + Node 单页应用「二」OAuth 2.0 授权认证 & GitHub 授权实践
关于项目 项目地址 预览地址 记录最近做的一个 demo,前端使用 React,用 React Router 实现前端路由,Koa 2 搭建 API Server, 最后通过 Nginx 做请求转发. ...
- bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序
也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...
- 单页web应用是什么?它又会给传统网站带来哪些好处?
文章来源:<单页Web应用:JavaScript从前端到后端> 什么是单页应用? 单页应用是指在浏览器中运行的应用,它们在使用期间不会重新加载页面.像所有的应用一样,它旨在帮助用户完成任务 ...
- 七天学会ASP.NET MVC(七)——创建单页应用
系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...
- 【初恋】vue单页应用开发总结
vue新人,没有高级技巧 本文主要总结了使用vue-cli脚手架安装开发环境,使用vue.js等进行单页应用开发所遇问题的总结. 技术栈: Vue v1.0.21, vue-resource v0.9 ...
随机推荐
- c# 用户自定义转换
class Program { public string Name; public int Age; public Program(string name ,int age) { Name = na ...
- jdk的配置(适用于win7、win8、win10)
一.前言 win7和win8的jdk配置基本一样,所以本文以win7和win10来说明配置. 二.win7jdk环境配置(win8和这个一样) 首先安装好jdk,这里已安装好jdk7,本文采取的是jd ...
- 9.并发_EJ
第66条: 同步访问共享可变的数据 所谓同步指的发出一个调用时,如果没有得到结果就不返回,直到有结果后再返回.另外相对应的是异步,指的是发出一个调用时就立即返回而不在乎此时有没有结果. 同步和异步关注 ...
- 关于openSetting通过tap的调用
问题模块 框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本 API和组件 小程序 Bug openSetting 工具 6.7.2 2.3.0 - 当前 Bug 的表现(可附上截图 ...
- 微信小程序之发送模板消息(通过openid推送消息给用户)
一.获取access_token access_token是接口调用的凭证,目前有效期为两个小时,需要定时刷新,重复获取将导致上次获取的access_token失效.(注:不建议每次调用需要acces ...
- JavaScript面试技巧之数组的一些不low操作
本文主要从应用来讲数组api的一些骚操作; 如一行代码扁平化n维数组.数组去重.求数组最大值.数组求和.js排序.对象和数组的转化等: 上面这些应用场景你可以用一行代码实现? 1.扁平化n维数组 1. ...
- 玩游戏 学Flex布局
大家好,今天推荐一个学习Flex布局的网页小游戏,非常不错,是国外的牛人开发的,值得一试,重复几次,就会大概了解Flex的属性了! 地址: http://flexboxfroggy.com/#zh-c ...
- js获取对象的长度
var obj= { "name": "wuqian", "sex": "famale", "hello&qu ...
- JAVA 多线程(3)
再讲线程安全: 一.脏读 脏读:在于读字,意在在读取实例变量时,实例变量有可能被另外一个线程更改了,导致获取到的数据出现异常. 在非线程安全的情况下,如果线程A与线程B 共同使用对象实例C中的方法me ...
- eclipse中maven项目jar包不会自动下载解决办法
Eclipse中maven从远程仓库中下载jar包有时会很慢,有些甚至进度停止不动,这个时候我们可能会终止当前下载,但是终止jar包下载后会出现一个问题,再次打开Eclipse时,你会发现提示你项目中 ...