本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
在中《详解Rest风格和设计原则》和《详细解读REST风格架构图、扩展性和level分级》,我们知道REST(Representational State Transfer)是一种软件架构风格。它将服务端的信息和功能等所有事物统称为资源,客户端的请求实际就是对资源进行操作。
REST的主要特点
- 每一个资源都会对应一个独一无二的url
- 客户端通过HTTP的GET、POST、PUT、DELETE请求方法对资源进行查询、创建、修改、删除操作
- 客户端与服务端的交互必须是无状态的
根据上面3个特点我们知道,REST主要强调的是无状态的。那么利用REST如何实现有状态的登录呢?这是REST面试和应用的一大难点。本文将根据这一难点来进行分享利用REST如何实现登录和会话跟踪。
基于Token进行身份验证
目前,大部分网站应用使用的是Session进行登录用户信息的存储及验证。但是随着网站的增多,我们需要N套账号密码,这时OAuth诞生了,它能极大的方便我们N套账号体系,记住N多的账号和密码,只需要一套账号密码,处处使用的时代来了。OAuth使用的就是基于Token的身份鉴别方式。而在移动端使用Token则更加普遍。Session和Token之间并没有太大区别,Token比较像是一个更加精简的自定义的Session。Session的主要功能是保持会话信息,而Token则只用于登录用户的身份鉴权。所以在移动端使用Token会比使用Session更加简易并且有更高的安全性,同时也更加符合RESTful中无状态的定义。
REST的登录交互流程
- 客户端通过登录请求提交用户名和密码,服务端验证通过后生成一个Token与该用户进行关联,并将Token返回给客户端。
- 客户端在接下来的请求中都会携带Token,服务端通过解析Token检查登录状态。
- 当用户退出登录、其他终端登录同一账号(被顶号)、长时间未进行操作时Token会失效,这时用户需要重新登录。
基于Cookie和Token的认证方式比较
RESTful中所有请求的本质都是对资源进行CRUD操作,所以登录和退出登录也可以抽象为对一个Token资源的创建和删除。
REST登录程序设计
1.未登录(身份验证)前,客户端(浏览器)POST请求带上用户名和密码进行身份验证
2.服务器根据用户名和密码进行身份验证,创建唯一的Token,然后将Token保存下来,具体可以是数据库,或其他缓存系统,并将Token返回给客户端
服务端生成的Token一般为随机的非重复字符串,根据应用对安全性的不同要求,会将其添加时间戳(通过时间判断Token是否被盗用)或url签名(通过请求地址判断Token是否被盗用)后加密进行传输。在本文中为了演示方便,仅是将User Id与Token以”_”进行拼接。
3.客户端在后续的操作中,带上Token,服务器验证Token是否合法,以及是否过期
RESTful中所有请求的本质都是对资源进行CRUD操作,所以登录和退出登录也可以抽象为对一个Token资源的创建和删除。Token的生成方式有很多种,例如比较热门的有JWT(JSON Web Tokens)、OAuth等。
Token相比Cookie的好处
- 处理跨域资源分享(CORS)——虽然 Cookie+CORS 也不是完全不可能,但是比较难搞
- 无状态性——有利于服务端扩展(伸缩性强)
- C/S 解藕——服务器端和客户端可以完全分离,进而静态资源可以用 CDN 来处理,服务器端完全变成 API Service
- CSRF Free——不依赖 Cookie,完全不担心跨域伪造请求攻击(这点尚有疑虑,有待考证)
版权声明:本文为博主原创文章,未经博主允许不得转载。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 基于Token的REST登录设计