基于Token的身份认证在高校实训互动平台中的应用研究
2018-09-17邹军国
邹军国
(滁州职业技术学院,安徽 滁州 239000)
加强实训实践教学是高职院校技能型人才培养的重要手段,目前各高职院校对实训环节管理相对缺失或滞后,构建一种实训互动平台迫在眉睫。随着互联网的快速发展,实训互动平台仅仅实现Web应用端已经无法满足用户需求。我们还需要实现移动Web、微信小程序以及移动APP等多用户端于一体的实训交互平台。在这些多用户端的系统平台中,传统的Web应用所采用的将登录信息存储在Cookie,Session或者本地数据文件中实现用户身份认证已经无法满足需求,并且这些方式还容易造成信息被截取等安全性问题。针对上述问题,我们在实训互动平台开发中采用Token(通常翻译为令牌)的身份认证是一种比较安全的方式。用户在登录时,应用程序调用获取令牌的接口,客户端将用户名和密码以请求的方式提交给服务端程序与数据库中用户信息进行匹配,成功则生成令牌。在令牌中还可以包含如这个令牌属于谁、这个令牌的有效期是多久、这个令牌当前登录的客户端类型以及设备ID等信息。在以后用户使用过程中都通过令牌的方式请求数据和资源,系统根据令牌的有效性将有效的数据响应给用户。
1 传统Web身份认证技术
目前,绝大多数应用程序都是基于一种无状态的HTTP协议互联网应用,它不能存储登录用户信息[1]。用户在登录使用用户名和密码输入后验证登录,每次请求服务器上的应用程序的时候都需要将用户名和密码提交服务器进行认证后再响应数据给用户,但是这些都可能对应用程序的安全性提出了挑战。
随着技术的发展,开发人员逐渐通过Cookie和Session这两种技术就解决了HTTP的无状态问题,可将用户身份信息记录在Cookie和Session中以解决身份认证问题。下面介绍一下这种身份认证模式的实现原理:用户首先使用用户名和密码以及验证码等信息登录,在登录时创建一个Session对象并生成唯一ID,将其存储在服务器端来记录用户登录的身份信息,然后将sessionid返回并存储在客户端的Cookie中,这样就在客户端与服务器端之间开始了一次会话,直到关闭浏览器或者说是关闭整个应用程序后会话才结束。在会话有效期内每次客户端向服务器端请求数据的时候就将在客户端使用Cookie存储的sessionid发送到服务器端,服务器端根据sessionid与服务器端存储的Session中的ID进行比较,如果一致则响应用户请求并返回数据,否则通知用户未通过身份认证无权访问资源。为了安全我们还可以将客户端IP地址和系统生成的随机码存储在Cookie和Session中,在用户请求服务器进行身份认证时可通过比对IP和随机码来增强系统的安全性。当然也可以使用RSA等加密算法来对存储的信息进行加密,确保系统安全。
上述采用Cookie和Session的会话模式确实解决了身份认证问题,但是这种模式依然存在很多问题,并且随着科技的发展和人们对用户体验的需求,一个企业级应用程序不仅仅包括PC端的桌面程序和Web程序,还必须提供手机APP和WAP端等。这些都对原来的身份认证模式提出了挑战,也暴露出很多缺点,具体分析如下。(1)Session:每次认证用户发起请求时,服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时,内存的开销也会不断增加。(2)可扩展性:在服务端的内存中使用Session存储登录信息,伴随而来的是可扩展性问题[2]。(3)跨域资源共享(Cross-Origin Resource Sharing,CORS),当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就会出现禁止请求资源情况。(4)跨站请求伪造(Cross Site request forgery,CSRF),如果用户在访问系统时,其他用户很容易伪造请求致使系统收到跨站请求伪造的攻击。在这些问题中,可扩展性是最突出的。因此我们有必要去寻求一种更有行之有效的方法[3]。
2 基于Token的身份认证原理
高校实训互动平台是集Web端、移动Web端、微信小程序和移动APP端等于一体的多用户端系统,为了满足需求并解决Cookie和Session会话模式的身份认证的不足,我们寻找一种新的身份认证模式即Token身份认证模型,就如古时候有些军队里传令官手持将军的令牌去调动部队一样,采用这种令牌的机制去处理身份认证问题。
基于Token身份认证技术就无须在客户端或服务端存储大量用户名密码等信息。不仅解决了有关敏感用户信息存储的问题,也解决了Session认证所造成的过多占用服务端内存资源的问题,而且服务端无需考虑用户是否已登录[4]。下面具体介绍以下基于Token的身份认证过程:(1)用户可使用不同客户端输入用户名和密码并发送请求到服务端。(2)服务端接收请求后查询数据库中用户信息并验证请求中的用户名和密码合法性。(3)验证通过后,服务端使用加密算法签发令牌,再将令牌响应给客户端。(4)客户端接收令牌后将它存储在客户端,在H5规范中可存储Cookie或Local Storage对象中,而在Android系统中也可存储Share Preference对象中。(5)之后客户端每次请求服务端资源时都须带着服签发的加密令牌,验证令牌的合法性,如果成功,根据用户权限向客户端响应数据。
每次发送请求时都需要将Token放在HTTP头部发送到服务端,以保证HTTP请求无状态。通过设置服务器属性Access-Control-Allow-Origin:*,让服务器能接受到来自所有域的请求[5]。需要注意的是,在ACAO头部标明(designating)*时,不得带有像HTTP认证,客户端SSL证书和cookies的证书。
3 实训互动平台身份认证解决方案
设计与开发高校实训互动平台项目中,我们搭建了一个轻量级微服务架构,使用Spring Boot作为微服务开发框架,使用zookeeper来注册微服务,通过Node.js将请求转发到Tomcat上,从而实现“反向代理”。该平台分为后端和前端两个部分,后端主要包括后台管理端和Restful服务端,前端主要包括PC端Web程序、Android端APP、iOS端APP以及微信小程序等多种客户端。在这些不同程序之间必须建立统一的身份认证系统。下面着重介绍在实训互动平台的身份认证系统中核心部分如何设计实现。
3.1 令牌设计
高校实训互动平台的身份认证采用的是基于Token的身份认证,显然Token(令牌)如何设计是整个身份认证系统中最重要的环节,针对高校实训互动平台需求的特点对Token进行了详细规划和设计,具体令牌构成主要包括用户名、用户ID、登录客户端类型、时间戳和过期时间等相关信息。项目中我们将用户名、用户ID和登录客户端类型等信息作为令牌的用户基本信息部分,将时间戳和令牌过期时间作为随机信息部分。首先我们介绍一下用户基本信息部分的具体格式,将信息以JSON的格式组合起来,再使用BASE64编码进行加密和解密。具体格式举例如下:
以上面格式构成用户基本信息为例,首先将JSON数据格式转换为字符串数据后使用base64编码进行加密,加密后结果如下:
与用户基本信息相比,随机信息主要是用于增加令牌的随机性和提高安全性。随机信息部分主要由时间戳和过期时间组成,用户在客户端使用用户名和密码进行第一次登录时,需验证一下请求参数中的时间戳与被请求服务器的时间是否一致,误差我们设定在保持合理范围内即可,一般为5 min,验证是否匹配,匹配则说明是合理登录。之后我们将时间戳和过期时间使用HS256算法进行加密,具体随机信息格式如下:
接下来将随机信息转换为字符串格式后使用HS256算法进行加密,加密结果如下:
上面也说了令牌主要是由用户基本信息和随机信息两部分组成,这两部分信息中间使用“.”隔开,最后得出上述例子的令牌如下:
这些令牌由服务端身份认证服务生成,响应到客户端使用Cookies存储在客户端。对于整个身份认证过程最重要的主要是登录和请求服务端资源的过程,下面对这两个过程进行说明。
3.2 登录过程
在高校实训互动平台中设定了部门实训管理员、学校实训管理员、校内实训指导教师、校外实训指导教师和学生等角色。不同角色拥有不同的权限,通过客户端登录后才能请求到服务端相应资源。用户登录是基于令牌身份认证的核心功能。具体登录过程时序如图1所示。
高校互动实训平台中基于令牌登录过程如下:第一次登录时,用户通过客户端输入用户名和密码通过POST请求发送到登录控制器(即Login Controller);登录控制器调用认证服务,认证服务通过用户信息服务获取用户信息并验证用户名和密码准确性,如果验证通过则生产令牌,具体令牌格式已经在令牌设计小节中做了详细描述;认证服务将验证结果返回给登录控制器,登录控制器将令牌设置到响应对象中返回给客户端;客户端通过本地存储技术将令牌存储在本地,以便于请求服务端资源时使用。
3.3 请求资源过程
客户端与服务端交互主要是通过HTTP请求实现的,在HTTP请求中核心部分就是请求资源过程,也是用户与服务端数据交互过程。每次客户端提交给服务端的请求都需要经过认证服务进行身份合法性认证之后才能响应相应资源给用户。具体基于令牌的请求资源过程时序如图2所示。
图1 登录过程时序
图2 请求资源过程时序
在高校实训互动平台中请求资源具体过程如下:用户请求任何资源时首先将请求提交给对应的资源控制器,再调用身份认证服务进行身份认证;认证服务通过请求对象查找到请求对象中的令牌信息,再验证令牌的合法性并进行角色判断;确认了令牌合法性和对应角色之后再请求对应的资源服务获取用户所需资源,并返回结果给资源控制器,再响应给用户。
4 基于令牌认证方案的优势
基于Token身份认证模式与之前描述的传统身份认证技术进行比较。首先,采用Token认证模式进行用户认证,则用户信息不用存储在Session中即使用户量大时也不会造成拥堵。其次,当用户请求资源时发送的是令牌而不是Cookie中存储的用户名和密码这样敏感信息,从而有效防止CSRF[6]。再次,在可扩展性方面Token能够创建与其他应用共享权限的程序。能通过一个帐号将所有应用程序关联起来,实现单点登录,登录成功后即可使用该应用程序的部分功能。最后,在多平台跨域方面,也就是CORS问题,对应用程序和服务进行扩展的时候,可以加入各种设备和应用程序。只要用户有一个通过了验证的Token,数据和资源就能够在任何域上被请求到。正因为这些优势我们在跨平台开发中选用Token去解决身份认证问题。
5 结语
本文通过介绍传统Web认证技术基础上描述基于Token的身份认证模式的原理,从而着重介绍了高校实训互动平台中多客户端身份认证解决方案。借助令牌设计、登录过程设计和请求资源过程设计3个方面阐述了在实训互动平台中是如何解决身份认证问题,该解决方案对其他多客户端平台开发也有非常宝贵的借鉴意义。