基于Token的REST登录设计

JAVA herman 3834浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

在中《详解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的认证方式比较

基于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的好处

  1. 处理跨域资源分享(CORS)——虽然 Cookie+CORS 也不是完全不可能,但是比较难搞
  2. 无状态性——有利于服务端扩展(伸缩性强)
  3. C/S 解藕——服务器端和客户端可以完全分离,进而静态资源可以用 CDN 来处理,服务器端完全变成 API Service
  4. CSRF Free——不依赖 Cookie,完全不担心跨域伪造请求攻击(这点尚有疑虑,有待考证)

版权声明:本文为博主原创文章,未经博主允许不得转载。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 基于Token的REST登录设计