我们在设计REST(Representational State Transfer)风格的Web service API,有一个问题经常要考虑,就是如何设计用户认证的体系(Authentication).
比较传统的做法是首先有一个登陆的API,然后服务器返回一个session ID,后续的操作客户端都必须带上这个session ID,但是这样的,服务就变成了有状态了,不符合REST风格的原则。另外,由于负载均衡的存在,必须有公共存储来保存用户的Session,这也增加了系统的复杂度。
所以比较好的做法是每次都传递认证信息,这样系统就是无状态的,当然由于每次都需要认证,必然降低了一些效率,必要的时候要考虑缓存用户信息在服务器端。
有几点要注意:
1.密码不能传播
一个比较低级的错误是通讯时,由客户端传递用户名和密码到服务器端认证,这样很容易被黑客攻击造成密码泄露。
标准的做法是使用HMAC(Hash-based Message Authentication Code),想法就是不传播password,而传播content和password的混合hash值。我们来看看Amazon S3怎么做认证的。
Amazon对每一个用户有一个AWSAccessKeyId和一个AWSSecretAccessKey,每次HTTP请求需要一个Id和一个Autherticantion信息。 比如:
GET /photos/puppy.jpg HTTP/1.1 Host: johnsmith.s3.amazonaws.com Date: Tue, 27 Mar 2007 19:36:42 +0000 Authorization: AWS 0PN5J17HBGZHT7JJ3X82: xXjDGYUmKxnwqr5KXNPGldn5LbA=
这个Authorization的头是这样产生的: 其中YourSecretAccessKeyID用的就是AWSSecretAccessKey。
Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature; Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of( YourSecretAccessKeyID, StringToSign ) ) ); StringToSign = HTTP-Verb + "n" + Content-MD5 + "n" + Content-Type + "n" + Date + "n" + CanonicalizedAmzHeaders + CanonicalizedResource; CanonicalizedResource = [ "/" + Bucket ] + <HTTP-Request-URI, from the protocol name up to the query string> + [ sub-resource, if present. For example "?acl", "?location", "?logging", or "?torrent"]; CanonicalizedAmzHeaders = <described below>
这样服务端就很容易根据用户信息来验证信息的正确与否。
2. 验证信息的位置
验证信息可以放在HTTP HEADER里面也可以放在HTTP URL里面,象这样:
GET /photos/puppy.jpg ?AWSAccessKeyId=0PN5J17HBGZHT7JJ3X82&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D HTTP/1.1 Host: johnsmith.s3.amazonaws.com Date: Mon, 26 Mar 2007 19:37:58 +0000
放在HTTP HEADER里面的好处是URL比较干净整洁,适合放在internet与人分享,而放在URL里面则有利于发布私有的访问权限给第三方。
3. 如何防范重放攻击(Replay attack)?
理论上,黑客可以窃取你的通讯报文,然后重新发送来通过认证。有几种可能的solution.
a. 客户端所以向服务器申请一个随机数,然后这个随机数作为下次通讯的key,一旦使用过后就立即失效,也就是所谓的”一次一密”。这种方法的好处是很安全,但是增加通讯量,而且由于负载均衡的存在,必须有公共存贮保存这个key。
b.服务器端保存使用过的authertication信息,只要是使用过的就拒绝再次使用。这种方法不需要客户端支持,但是需要公共空间来保持历史记录。
c.使用时间戳。做法就是认证信息中含有时间信息,这样服务器端就可以拒绝时间相隔太长的请求,认为其已经过期。这种做法需要服务器端和客户端有某种形式的时间同步。
4.要不要使用HTTPS?
如果安全度要求很高或者是针对internet的API,无疑应该使用HTTPS,来避免内容被窃取的可能。
如果只是在局域网范围或者可信赖的计算环境,则使用HTTP来提高一点效率。
相关推荐
基于springboot+sureness的面向REST API资源无状态认证权限管理系统 项目经过严格测试,确保可以运行! 基于springboot+sureness的面向REST API资源无状态认证权限管理系统 项目经过严格测试,确保可以运行! ...
django-rest-knox, 用于 Django rest认证的认证模块 django-rest-knox 用于 Django rest认证的认证模块jax - rpc为 Django REST框架提供了易于使用的认证,目的是允许应用程序中的普通模式,无需额外工作,并确保...
django-rest-framework-jwt, Django REST框架的JSON网络令牌认证支持 REST框架JWT认证 Django REST框架的代价为的JSON Web令牌认证项目的完整文档在文档可用。概述这个包提供了对 Django REST框架框架的 JSON网络...
REST API认证权限管理系统 - 基于SpringBoot和Sureness...该系统提供了一个面向REST API的无状态认证和权限管理解决方案,通过Java技术实现界面交互和功能模块,为用户提供了一个高效、易用的API认证和权限控制平台。
主要介绍了Django Rest framework认证组件详细用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
使用rest-framework在django中创建和认证token,用于在移动端来认证和用户,本文通过自己编写模型来实现根据用户来生成token,在请求头中添加Authentication来进行认证,保持登录状态。可以直接使用,编写过程可以...
C# WEB API 安全认证源码。找到很多资料,光看到说没个代码的,现在终于有个完整的认证源码,带SQL SERVER数据库配置文件,兄弟们下载吧。
面向 REST API 的认证鉴权,基于 RBAC (用户-角色-资源)主要关注于对 API 的安全保护。无特定Web框架依赖(已有 Spring Boot,Quarkus,Javalin,Ktor,Micronaut,Jfinal,Solon 等集成样例)。支持动态修改权限配置(动态...
Sureness 是我们在深度使用 Apache Shiro 之后,吸取其优点全新设计开发的一个认证鉴权框架,面向 REST API 的认证鉴权,基于 RBAC (用户-角色-资源)主要关注于对 API 的安全保护,无特定Web框架依赖(已有 SpringBoot,...
Spring Security开发安全的REST服务包含视频和源码,最细致地讲解Spring Security、Spring Social 、Spring Security OAuth三种技术开发安全的REST服务,彻底掌握一线互联网公司主流的身份认证和授权方式。
新一代基于Spring Boot、Spring Security、Oauth2等实现的权限控制和认证服务、支持第三方oauth授权和获取资源信息功能等;Spring Boot+Spring Security+JWT实现给RestApi增加认证控制
本项目是一个基于Java的面向REST API的高性能认证鉴权框架设计源码,共包含626个文件,其中包括227个Java文件、125个Markdown文件等。系统采用了Java、CSS、JavaScript、HTML和Kotlin等技术,为用户提供了一个功能...
django-rest-framework-proxy, Django Rest框架代理视图 Django Rest框架代理 提供将传入请求重定向到其他API...功能:伪装路径HTTP基本认证( 在API和后端API之间)令牌认证支持的方法:GET/POST/PUT/PATCH文件上传待办
Django REST framework框架学习材料,包括DRF入门、DRF工程搭建、Serializer序列化器、视图、权限与认证、过滤、排序、异常处理以及自动生成接口文档等。
概述:无缝集成和测试 SOAP 和 REST 服务。 描述: 无缝集成和测试SOAP和REST服务。 您是否正在寻找可以帮助您访问和使用REST和SOAPWeb服务的出色应用程序? 您想通过一个新的、有用的SOAP客户端将您的体验提升到一...
主要介绍了django rest framework 实现用户登录认证详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
基于springboot+sureness的面向REST API资源无状态认证权限管理系统