`

REST和认证

 
阅读更多

我们在设计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资源无状态认证权限管理系统 项目经过严格测试,确保可以运行! 基于springboot+sureness的面向REST API资源无状态认证权限管理系统 项目经过严格测试,确保可以运行! ...

    django-rest-knox, 用于 Django rest认证的认证模块.zip

    django-rest-knox, 用于 Django rest认证的认证模块 django-rest-knox 用于 Django rest认证的认证模块jax - rpc为 Django REST框架提供了易于使用的认证,目的是允许应用程序中的普通模式,无需额外工作,并确保...

    django-rest-framework-jwt, Django REST框架的JSON网络令牌认证支持.zip

    django-rest-framework-jwt, Django REST框架的JSON网络令牌认证支持 REST框架JWT认证 Django REST框架的代价为的JSON Web令牌认证项目的完整文档在文档可用。概述这个包提供了对 Django REST框架框架的 JSON网络...

    C# WEB API 安全认证源码 REST

    在C# Web API开发中,...综上所述,这个"C# WEB API 安全认证源码 REST"为开发者提供了一个实践性的安全认证解决方案,涵盖了从数据库配置到身份验证中间件的多个方面,对于学习和理解Web API的安全性具有很高的价值。

    REST Server in Delphi XE Using DataSnap中文版

    **安全性和认证**: 实现必要的安全措施,如身份验证和授权机制,确保只有经过认证的用户才能访问 REST 服务。 #### 3. 使用 JSON 进行数据交换 - **JSON 支持**: Delphi XE 提供了内置的支持来处理 JSON 数据,...

    Django-REST-framework教程中文版

    本教程基于Django1.9以及restframework-v3.3.3版本,着重介绍了序列化、请求和响应处理、类视图、认证和权限、关联关系及超链接处理以及ViewSets和Routers的使用。 首先,在快速入门章节中,教程引导我们如何搭建一...

    基于SpringBoot和Sureness的REST API资源认证权限管理系统设计源码

    REST API认证权限管理系统 - 基于SpringBoot和Sureness...该系统提供了一个面向REST API的无状态认证和权限管理解决方案,通过Java技术实现界面交互和功能模块,为用户提供了一个高效、易用的API认证和权限控制平台。

    Building a Rest API with Spring

    本文主要介绍了使用Spring框架构建REST API的全过程,内容包括了从基础的Spring Web应用搭建,到使用Java配置,再到通过Spring Security进行安全认证和授权,以及REST API的其他重要特性,例如:使用HTTP消息转换器...

    JIRA REST Java Client

    **JIRA REST Java Client**是Atlassian官方提供的一款用于与JIRA进行交互的Java库,它使得开发人员能够轻松地通过RESTful API访问和操作JIRA系统。这个库提供了丰富的功能,包括创建、更新、查询问题(issues)、...

    Rest Severs in Delphi XE Using DataSnap

    在Delphi XE提供的"REST Servers in Delphi XE Using DataSnap.pdf"文档中,详细介绍了这些步骤以及更多高级特性,例如JSON序列化、认证和授权、错误处理等。同时,"CodeSample"文件可能包含了实际的代码示例,帮助...

    kettle rest 接口 请求实例

    在Kettle中,REST接口提供了一种灵活的方式与外部系统进行通信,例如,发送和接收JSON数据,执行各种操作。本教程将深入探讨如何使用Kettle与RESTful服务进行交互。 首先,我们要理解REST(Representational State ...

    关于activiti rest服务

    为了确保安全性,Activiti REST服务可以通过基本认证、OAuth2或其他安全机制进行授权。在生产环境中,应确保对API的调用进行了适当的限制和监控,以防止滥用和潜在的安全风险。 在实际项目中,结合前端UI或后端服务...

    rest api 接口测试工具

    REST API(Representational State Transfer Application Programming Interface)接口已经成为现代Web服务和应用程序开发的重要组成部分。它是一种轻量级、基于HTTP协议的API设计风格,用于在客户端和服务器之间...

    REST in practice,英文

    5. **安全性和认证**:REST服务的安全性通常是通过HTTPS提供,书中的内容可能涉及如何实施安全的RESTful服务,包括OAuth和其他身份验证机制。 6. **性能和缓存**:REST设计鼓励使用HTTP的缓存机制,以提高响应速度...

    Artifactory-REST-examples.zip

    这些示例通常包含了完整的HTTP请求构造、认证过程、错误处理等细节,是学习和实践Artifactory REST API的宝贵资源。 总的来说,“Artifactory REST Examples”是掌握Artifactory操作的关键,通过实际的代码示例,...

    arcgis server rest api

    ArcGIS Server REST API支持多种身份验证机制,包括基本认证、OAuth2.0、Kerberos等,确保了服务的安全性。 6. **服务类型** REST API支持多种服务类型,如Map Service、Image Service、Feature Service等,分别...

Global site tag (gtag.js) - Google Analytics