Restful安全认证及权限的解决方案

一、Restful安全认证常用方式  1.Session+Cookie  传统的Web认证方式。需要解决会话共享及跨域请求的问题。  2.JWT  JSON Web Token。  3.OAuth  支持两方和三方认证,是目前使用比较广泛的安全认证方式,但对于不使用第三方登录的认证的方式不太适用。  二、JWT简介  JWT由三部分组成,包括Header、Payload和Signature。 

JSON Web Token example:  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.  eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0. yRQYnWzskCZUxPwaQupWkiUzKELZ49eM7oWxAQK_ZXw 

Example Header: 

{ 
  “alg”: “HS256”, 
  “typ”: “JWT” 
} 

通过加密后得到:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9  一般Payload包括以下几方面内容:   iss: The issuer of the token   sub: The subject of the token   aud: The audience of the token   exp: Token expiration time defined in Unix time   nbf: “Not before” time that identifies the time before which the JWT must not be accepted for processing   iat: “Issued at” time, in Unix time, at which the token was issued   jti: JWT ID claim provides a unique identifier for the JWT  Example Payload: 

{ 
  “iss”: “toptal.com”, 
  “exp”: 1426420800, 
  “https://www.toptal.com/jwt_claims/is_admin”: true, 
  “company”: “Toptal”, 
  “awesome”: true 
} 

通过加密后得到:  eyJpc3MiOiJ0b3B0YWwuY29tIiwiZXhwIjoxNDI2NDIwODAwLCJodHRwOi8vdG9wdGFsLmNvbS9qd3RfY2xhaW1zL2lzX2FkbWluIjp0cnVlLCJjb21wYW55IjoiVG9wdGFsIiwiYXdlc29tZSI6dHJ1ZX0 Example Signature:  通过密钥对Header和Payload生成签名。  JWT的优势:  无状态,可以无限水平扩展  可重用,可以在多语言多平台多域中使用  安全性高,由于没有使用Cookie,因此可以防止跨站请求伪造(CSRF)攻击  性能好,只验证令牌并解析其内容  三、JWT认证方式的实现方式  1.客户端不需要持有密钥,由服务端通过密钥生成Token。  2.客户端登录时通过账号和密码到服务端进行认证,认证通过后,服务端通过持有的密钥生成Token,Token中一般包含失效时长和用户唯一标识,如用户ID,服务端返回Token给客户端。  3.客户端保存服务端返回的Token。  4.客户端进行业务请求时在Head的Authorization字段里面放置Token,如:  Authorization: Bearer Token  5.服务端对请求的Token进行校验,并通过Redis查找Token是否存在,主要是为了解决用户注销,但Token还在时效内的问题,如果Token在Redis中存在,则说明用户已注销;如果Token不存在,则校验通过。  6.服务端可以通过从Token取得的用户唯一标识进行相关权限的校验,并把此用户标识赋予到请求参数中,业务可通过此用户标识进行业务处理。  7.用户注销时,服务端需要把还在时效内的Token保存到Redis中,并设置正确的失效时长。 

四、在实际环境中如何使用JWT  1.Web应用程序  在令牌过期前刷新令牌。如设置令牌的过期时间为一个星期,每次用户打开Web应用程序,服务端每隔一小时生成一个新令牌。如果用户一个多星期没有打开应用,他们将不得不再次登录。  2.移动应用程序  大多数移动应用程序用户只进行一次登录,定期刷新令牌可以使用户长期不用登录。  但如果用户的手机丢失,则可提供一种方式由用户决定撤销哪个设备的令牌。当然,这就需要服务端记录设备的名称,例如“maryo的iPad”。然后用户可以去申请并撤销获得“maryo的iPad”。当用户修改密码时需要服务端把原Token保存到Redis上,使其失效。  为了防止Token被窃取,最好把JWT和HTTPS结合起来使用。  五、如何实现安全认证与权限的结合  服务端生成的Token中需要包含用户唯一标识,这样用户进行业务请求时,服务端通过附带的Token获取用户唯一标识,通过此标识进行权限检查。  六、更换Token  为了解决高并发访问时更换Token, 有可能造成用旧的Token的访问失败。 在缓存中不保存Token,而是保存一个计数,每次更换Token时,计数加1,这个计数的值会跟用户ID一起加密后保存在新生成的Token中,返回给用户,用户每次访问时携带这个Token。验证用户Token时,用Token中的计数与缓存中保存的计数比较,如果差值范围在1~2之间就认为Token有效,这样即使在并发访问时,更换Token,计数值虽然不等,但在规定的差值范围内,也被认为有效,这样就解决了上面的Token失效问题。  七、附录  https://www.toptal.com/web/cookie-free-authentication-with-json-web-tokens-an-example-in-laravel-and-angularjs  http://stackoverflow.com/questions/26739167/jwt-json-web-token-automatic-prolongation-of-expiration  http://www.haomou.net/2014/08/13/2014_web_token/  https://jwt.io/ 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏琯琯博客

laravel 5.4 + dingo api + jwt 代替 Passport

新装一个LV composer create-project --prefer-dist laravel/laravel myApiProject 安装ding...

3038
来自专栏Ceph对象存储方案

Luminous下删除和新建OSD的正确姿势

L版本开始极大的降低了对运维操作复杂度,新增了很多命令去确保数据安全,很多新手在删除OSD的时候很容易忽视了集群PGs的状态最终导致数据丢失,因此官方加入以下几...

1482
来自专栏IT民工生存指南

初试 Kubernetes -集群搭建

主节点(个人很喜欢腾讯云的主机自动命名,内网IP之类的都已经在hostname里了,不容易出错)

1714
来自专栏LanceToBigData

linux命令详解之netstat

今天在使用linux的时候,要查看端口号,但是不知道要使用哪一个命令所以就学习了一下,原来是使用netstat,接下来给大家一起来学习。 一、netstat介绍...

22310
来自专栏CaiRui

LNMP之Nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问...

3258
来自专栏晓晨的专栏

Docker for Windows 使用入门

3482
来自专栏bboysoul

部署包安装zabbix

昨天给树莓派安装上了一个温度传感器,今天想使用zabbix去统计监控树莓派上温度传感器的数据,所以我就开始在我的一台不怎么用的阿里云服务器上安装zabbix了 ...

892
来自专栏KaliArch

Kubernetes+Prometheus+Grafana部署笔记

Kubernetes(通常写成“k8s”)Kubernetes是Google开源的容器集群管理系统。其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应...

844
来自专栏张善友的专栏

Quartz.NET 3.0 正式发布

Quartz.NET是一个强大、开源、轻量的作业调度框架,你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,支持...

21310
来自专栏极客慕白的成长之路

Pan Download – 百度网盘不限速下载器

百度网盘作为目前国内最大的网盘服务,下载速度对普通用户一直都非常不友好。Pan Download 是由 Kiryuu@吾爱破解 开发的绿色软件,无需安装,即下即...

824

扫码关注云+社区