`

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/
  • 大小: 147.6 KB
  • 大小: 53.7 KB
分享到:
评论

相关推荐

    C# WEB API 安全认证源码 REST

    本源码提供了一个完整的安全认证解决方案,适用于RESTful服务。下面将详细介绍其中涉及的关键知识点。 1. **C# Web API**:C# Web API是微软开发的一个用于构建HTTP服务的框架,它支持多种平台,包括.NET Framework...

    SaToken实现Restful风格

    在IT行业中,RESTful风格的API设计已经成为...这种解决方案不仅保持了RESTful接口的简洁性,同时也确保了权限控制的精确性。通过这种方式,开发者可以充分利用SaToken的强大功能,同时享受到RESTful设计带来的好处。

    VueCRUD一个基于Vuejs的RESTfulCRUD系统

    Vue.js是一种轻量级、高性能的前端JavaScript库,它以其组件化结构、响应式数据绑定和易于学习的特点在Web开发领域广受欢迎。VueCRUD利用Vue.js的优势,为开发者提供了一个快速搭建后台数据管理界面的解决方案。 ...

    微服务架构中的认证权限控制设计.docx

    虽然提供了一种高可用和可扩展的解决方案,但需要安全链接访问,实现上可能较复杂。 2. 基于OAuth2 Token的方案:随着RESTful API和微服务的发展,OAuth2 Token认证变得越来越流行。它允许服务端无状态,因为Token...

    Drupal Restful simple

    总的来说,Drupal Restful 提供了一套完整的解决方案,让 Drupal 成为一个强大的 API 提供者,适用于构建现代的、数据驱动的 web 应用程序。结合 RestEasy 等工具,开发者可以更加高效地构建和维护 Drupal 的 ...

    基于springboot+sureness的面向REST API资源无状态认证权限管理系统.zip

    标题中的“基于springboot+sureness的面向REST API资源无状态认证权限管理系统”是一个使用Spring Boot框架和Sureness库构建的API安全解决方案。这个系统旨在为RESTful API提供无状态的认证和授权管理,确保API服务...

    关于Rails登录和验证插件http_authentication restful-authentication

    AuthLogic是一个灵活、可定制的Rails认证解决方案,它允许开发者定义自己的认证逻辑,而不像`restful-authentication`那样预设一套完整的流程。AuthLogic与Rails的ActiveRecord紧密集成,提供了会话管理、密码加密、...

    基于springboot+sureness的面向REST API资源无状态认证权限管理系统

    总的来说,基于Spring Boot和Sureness的REST API资源无状态认证权限管理系统是一种高效且灵活的解决方案。它结合了Spring Boot的便捷性与Sureness的无状态认证特性,能帮助开发者快速构建安全的RESTful服务。通过...

    统一身份认证系统

    统一身份认证系统的核心目标是提供一种集中化的机制,使得用户只需一次登录,就能访问到多个相互关联的应用或服务。这种系统极大地简化了用户管理,提高了安全性,并降低了运营成本。对于开源的统一身份认证系统,它...

    使用Microsoft+.NET的企业解决方案模式.chm

    Entity Framework则是一种对象关系映射(ORM)工具,它允许开发者以面向对象的方式操作数据库,降低了数据库操作的复杂性。 在企业级解决方案中,安全性也非常重要。.NET框架提供了身份验证、授权和加密等机制,...

    短信平台解决方案

    短信平台是一种用于批量发送和接收短信的系统,广泛应用于企业营销、客户服务、验证代码等场景。在本解决方案中,我们将探讨如何构建一个自动收发短信的平台,以便提高效率并优化用户体验。 **一、系统架构** 1. *...

    Python库 | pyramid-restful-framework-0.6.5.tar.gz

    Pyramid RESTful Framework是基于Pyramid框架的一个扩展,它为开发者提供了一套强大的工具,用于创建高效、灵活且可扩展的API解决方案。 **Pyramid框架简介** Pyramid是一个轻量级的Python Web框架,它允许开发者...

    - 采用SpringBoot、MyBatis、dubbo框架,RESTFUL接口,自定义的功能级权限系统,极低门槛,拿来即用

    至于功能级权限系统,这是对用户访问控制的一种实现,允许管理员根据不同的功能模块设置权限,控制不同用户或角色可以访问哪些功能。这种系统通常包括用户管理、角色管理、权限分配等部分,确保了系统的安全性,防止...

    spring security(权限框架)

    它提供了全面的安全解决方案,包括用户认证、授权、会话管理以及对常见攻击(如CSRF)的防护。Spring Security能够无缝集成到Spring框架的应用程序中,因此在Spring生态系统中广泛使用。 **1. 用户认证** Spring ...

    Laravel开发-laravel-restful-helper

    在本文中,我们将深入...它通过提供预定义的解决方案和优化的代码结构,使得API开发更加高效,同时保持了RESTful设计的最佳实践。无论你是新手还是经验丰富的开发者,这个工具都能极大地提升你的开发效率和代码质量。

    C#完整版权限管理系统

    【标题】"C#完整版权限管理系统"是一个基于C#...总的来说,"C#完整版权限管理系统"是一个全面的解决方案,集成了强大的后端处理能力、便捷的前端交互以及美观的用户界面,旨在为企业级应用提供高效、安全的权限管理。

    SpringBoot+Shiro权限管理系统脚手架.rar

    它提供了一种快速开发企业级权限管理系统的解决方案,适用于中小型项目,帮助开发者快速搭建具有用户登录、权限控制、角色管理等功能的系统。 SpringBoot是Spring框架的一种简化版本,它内置了Tomcat服务器,简化了...

Global site tag (gtag.js) - Google Analytics