`

Rop开发手册(3):最简单的服务开放平台框架

阅读更多
引用
Rop项目文档前后写了一个多月,在写的过程中发现很多功能不完善的,又回过头了改项目,此种反复多次,现在Rop开源项目的文档已经差不多了,将陆续在iteye此发出,希望对大家有帮助。在Rop项目的开发过程中得到了众多iteye网友的有力帮助,收到了很多很好的整改的意见,在此对他们的奉献和帮助表示诚挚的感谢,这些网友包括但不限于:
melin
kellokitty
風一樣的男子
lioliang
木木的爱情童话
devotionalist
ericliang
 


目录
1.快速了解Rop
2.请求服务模型
3.应用授权及验证
4.服务会话管理
5.错误处理模型
6.响应报文控制
7.文件上传
8.服务安全控制
9.拦截器及事件体系
10.性能调优
11.开发客户端SDK
12.参考资料

应用键/应用密钥

当用户需要访问某个应用系统前,应用系统一般都需要对该用户进行身份认证。常见的身份认证方法是让用户输入“用户/密码”,当通过验证后,允许进入系统,否则阻止用户登录系统。

和应用系统类似,服务开放平台也需要对接入的应用进行身份认证,以确保服务只向合法授权的客户端应用开放。一般的做法是:服务开放平台通过一个应用申请流程向通过审核的开发者分配一个唯一的应用键和应用密钥(即appKey/secret)。应用键是公开的,而应用密钥是保密的,只有开发者自己知道。

开发者开发的应用在访问开放平台的服务时,都必须带上这个appKey,以亮明自己的身份。此外,还必须通过应用密钥对请求数据进行签名,开放平台通过验证服务请求的签名判断客户端应用的合法性。也就是说,开放平台通过appKey/secret的机制对应用进行身份认证。

应用键/密钥管理器

由于Rop需要在服务端采用相同的算法计算请求参数的签名,并和客户端传送过来的签名进行比较,如果两者相等,便认为当前交互的客户端是合法的客户端,反之则认为是一个非法的客户端。

因此,服务端必须知道应用键及其应用密钥的信息,这样才能顺利完成服务端签名验证的工作,Rop通过com.rop.security.AppSecretManager接口访问应用键/密钥。您可以采用适合的方式保存应用键/密钥,如保存在数据库、LDAP、文件系统等地方,然后编写一个访问应用键/密钥的AppSecretManager实现类就可以了。

AppSecretManager拥有两个接口方法:
  • boolean isValidAppKey(String appKey):判断appKey是否是合法的应用键;
  • String getSecret(String appKey):根据appKey获取对应的应用密钥。


Rop默认提供了一个基于文件存储的FileBaseAppSecretManager实现类,FileBaseAppSecretManager默认使用读取类路径下的rop.appSecret.properties属性文件,获取应用键/密钥,属性文件中应用键/密钥采用如下方式保存:
引用
00001=abcdeabcdeabcdeabcdeabcde
00002=abcdeabcdeabcdeabcdeaaaaa

属性名对应应用键,属性值对应应用密钥。如果属性文件放置在其它地方,则可以通过appSecretFile属性指定位置,appSecretFile支持“classpath:”等Spring资源类型的前缀。

由于大型服务平台一般是分布式的,所以将应用键/密钥保存在系统文件中并不是个好主意。如果开发者希望提供自定义的AppSecretManager,可通过<rop:annotation-driven/>的app-secret-manager属性进行配置:

<rop:annotation-driven  app-secret-manager="appSecretManager"/>
<bean id="appSecretManager" class="com.rop.sample.SampleAppSecretManager"/>


这样,Rop就会使用SampleAppSecretManager取代默认FileBaseAppSecretManager进行应用键/密钥的读取工作了。

签名算法

Rop的签名算法直接参考了TOP的签名算法,该签名算法描述如下:

(1)所有请求参数按参数名升序排序;
(2)按请求参数名及参数值相互连接组成一个字符串:<paramName1><paramValue1><paramName2><paramValue2>…;
(3)将应用密钥分别添加到以上请求参数串的头部和尾部:<secret><请求参数字符串><secret>;
(4)对该字符串进行SHA1运算,得到一个二进制数组;
(5)将该二进制数组转换为十六进制的字符串,该字符串即是这些请求参数对应的签名;
(6)该签名值使用sign系统级参数一起和其它请求参数一起发送给服务开放平台。

假设,user.create的服务有3个业务级参数,分别为userName、age及sex。这些业务级参数和系统级参数的值如下表所示:
系统级参数名称 参数值 v业务级参数名称 参数值
appKey 000001 userName tomson
sessionId AAAA age 24
method user.create sex 1
v 1.0
format xml
locale zh_CN


根据Rop的签名算法,首先按字母顺序将所有参数名和参数值拼装成一个字符串:

引用
age24appKey000001formatxmllocalezh_CNmethoduser.createsessionIdAAAAsex1userNametomsonv1.0


假设,appKey为000001的secret(应用密钥)是“abcdef”,则将“abcdef”分别添加到以上请求参数串的头部和尾部,得到:

引用
abcdefage24appKey000001formatxmllocalezh_CNmethoduser.createsessionIdAAAAsex1userNametomsonv1.0abcdef


对以上字符串进行SHA1签名运算,将签名值转换为十六进制的编码串,得到:
引用
8625FD7EEAE1E68203B48C64DE495792BF59E833

最后,客户端即可使用如下的URL请求串对user.create服务方法发起请求:
引用
http://<serverUrl>/<ropServletUri>?appKey=000001&method=user.create&…&sign=8625FD7EEAE1E68203B48C64DE495792BF59E833


签名功能控制

默认情况下,Rop会对每个服务请求进行签名验证,如果签名验证报错,将直接驳回请求并回报相应的错误信息。Rop允许服务平台开发者开启或关闭签名验证的功能,Rop提供了3个级别的控制:

  • 平台级:开启或关闭服务平台所有服务的签名验证功能;
  • 服务级:在平台级签名验证功能开启的情况下,可以关闭某个具体服务的签名验证;
  • 参数级:在后续内容中,我们知道Rop的签名算法要求把所有的参数拼装成一个字符串,如果有些参数值很大(如上传文件的文件内容),签名算法将需要构造一个很大的字符串,占用很大的内存。从安全上来说,仅需对一些关键的参数进行签名就可以了,并非一定要对所有的参数进行签名。有鉴于此,Rop在服务签名时允许忽略某些参数,提供参数级的签名控制。


平台级控制

通过<rop:annotation-driven/>的sign-enable属性即可开启或关闭服务平台签名验证功能:

<rop:annotation-driven sign-enable="false"/>


我们强烈建议在生产环境下开启服务签名验证的功能,以保证服务平台的安全性,免受恶意客户终端的攻击。
服务级控制

在平台级签名功能开启的情况下,Rop还允许关闭某个服务的签名验证功能。通过将@ServiceMethod的ignoreSign属性设置为IgnoreSignType.YES即可:

@ServiceMethod(method = "user.add", version = "5.0", ignoreSign = IgnoreSignType.YES)
public Object addUser5(CreateUserRequest request) {
	CreateUserResponse response = new CreateUserResponse();
	response.setCreateTime("20120101010102");
	response.setUserId("4");
	return response;
}


这样,客户端在访问user.add#5.0的服务方法时,就不必提供请求参数的签名信息了。

参数级控制

在定义服务方法的RopRequest类时,只要在RopRequest的某些属性上标注了@IgnoreSign,这些属性所对应的请求参数就可以排除在签名参数列表之外了。来看一个例子:

public class LogonRequest extends AbstractRopRequest{
    
@Pattern(regexp = "\\w{4,30}")
    private String userName;

    @IgnoreSign
    @Pattern(regexp = "\\w{6,30}")
    private String password;	
	...
}


LogonRequest的password属性所对应的请求参数将不会纳入到签名算法的参数列表中。使用这种办法,可以在具体的RopRequest类中将某些属性对应的请求参数排除在签名算法之外。

如果希望某一类型的属性统一忽略签名,有没有简单的方法呢?Rop提供了一种非常便捷的方法,即在属性类定义处使用@IgnoreSign注解即可。如用于保存上传文件的UploadFile类就标注了@IgnoreSign注解:

@IgnoreSign
public class UploadFile {
    private String fileType;
    private byte[] content;
}


这样,UploadFile作为任何RopRequest类的属性都将排除在签名算法的参数列表之外。关于UploadFile的进一步信息,请参见后续的内容。
分享到:
评论

相关推荐

    Rop开发手册

    Rop框架适用于各种服务开放平台的开发,尤其适合那些需要处理复杂应用层面问题的场景,如电商平台、社交媒体平台等。通过利用Rop提供的成熟解决方案,开发者可以减少重复劳动,更加专注于业务逻辑的实现,提高开发...

    ROP(Rest Open Platform)用户开发手册

    Rop,即Rapid Open Platform,是一个参考淘宝开放平台(TOP Taobao Open Platform)的平台设计思路,充分借鉴Spring MVC的技术架构原理开发的一个快速服务开放平台开源框架项目,可以让您迅速构建成熟的SOA服务平台。...

    基于淘宝开放平台开源的rop

    总之,ROP框架为开发者提供了一套全面且易于使用的工具集,不仅降低了构建服务开放平台的门槛,还极大地提高了开发效率。通过借鉴淘宝开放平台的成功实践,ROP框架能够在各种复杂的业务场景下表现出色,为构建高效、...

    rop开放平台

    在描述中提到的“rop开放平台s”可能是这个平台的某种特定版本或服务,但信息过于简略,无法提供更详细的解释。通常,这样的平台可能会提供以下功能: 1. **漏洞分析**:用户可以上传目标二进制文件,平台会分析其...

    Rop framework

    与传统的 WebService 框架(例如 CXF 和 Jersey)不同,Rop 不仅提供了 WebService 的核心功能,还针对服务开放平台中的应用层问题提供了多种解决方案。 **特点**: 1. **易于上手**:Rop 的设计使得开发者能够...

    rop demo完整用例

    本示例是基于Maven构建的ROP框架,Maven是一个流行的Java项目管理工具,它帮助开发者管理和构建项目,依赖管理、构建过程自动化等功能使得开发更加便捷。在本案例中,Maven被用来组织和管理项目的依赖关系,确保所有...

    ROP(Rest Open Platform)开发指南

    ### ROP(Rest Open Platform)开发指南知识点解析 #### 一、REST服务框架的问题域 REST服务框架在解决Web服务的交互过程中面临多种挑战。主要包括: 1. **通讯报文协议**:REST服务通常需要支持多种数据交换格式,...

    ROP(Rest-Open-Platform)开发指南

    #### REST服务框架的问题域与解决方案 REST(Representational State Transfer)是一种轻量级的网络应用程序架构风格,被广泛应用于Web服务中。ROP(Rest-Open-Platform)作为一种面向RESTful服务的开发框架,旨在...

    rop-master.rar

    RopRop 开发类似于淘宝 开发类似于淘宝 开发类似于淘宝 开发类似于淘宝 服务开放平台 服务开放平台 服务开放平台 这样的服务平台 这样的服务平台 这样的服务平台 这样的服务平台 。RopRopRop充分借鉴了当前大型网站...

    ROP : Read origin protocol:ROP 是一种计算协议,用于发现所有读取的来源-开源

    ROP 是一种计算协议,旨在发现所有读数的来源,这些读数源自复杂的 RNA 分子、重组抗体和微生物群落。 ROP 占 poly(A) 和核糖耗竭协议所有读数的 98.8%,而传统的基于参考的协议为 83.8%。 ROP 分析重复、circRNA、...

    rop-sample.rar_.comrop_rop_rop源码下载_taobao netty

    ROP在淘宝的网络通信框架中扮演了重要角色,它允许开发者构建安全且高性能的网络服务。而Netty,作为一个异步事件驱动的网络应用框架,为各种协议(包括TCP、UDP等)的服务器和客户端提供了高度可定制化和高性能的...

    Rop-Fast:快速跳动

    Rop-Fast在Rop的基础上进行了扩展和优化,解决了原始框架中的一些问题,并提供了更友好的API和更快的性能,使得开发人员能够更高效地构建Web服务。 **RESTful服务介绍** REST(Representational State Transfer)是...

    rop-plus:rop框架修改加强版

    `rop-plus`是一个针对Java平台的ROP框架的增强版本,它为开发者提供了更强大的工具和功能,以进行ROP攻击的研究和防御。框架的主要特点可能包括: 1. **gadget库**:`rop-plus`可能包含了一个庞大的Java gadget库,...

    apple-rop:Apple里面集成ROP框架

    在iOS开发中,为了提高代码的安全性和执行效率,开发者们经常使用各种技术手段,其中一种是Return-Oriented Programming(ROP)框架。本文将深入探讨Apple内部集成的陈雄华的ROP框架,以及其在Java环境下的应用。 *...

    Rapid Open Platform

    Rop,即Rapid Open Platform,是一个参考淘宝开放平台(TOP Taobao Open Platform)的平台设计思路,充分借鉴Spring MVC的技术架构原理开发的一个快速服务开放平台开源框架项目,可以让您迅速构建成熟的SOA服务平台。...

    开放平台(Open Platform)

    开放平台是指软件系统或网络服务通过公开其应用程序编程接口(API)或特定函数的方式,允许外部开发者开发的应用程序能够访问和利用该系统的功能或资源,而无需直接修改系统源代码。这种设计方式促进了软件生态系统...

    rop轻松谈.pdf

    ROP輕鬆談 ROP(Return Oriented Programming)是一種exploit技术,該技術通過在程式碼中注入惡意代碼,控制程式的執行流程,達到攻擊的目的。本文將對ROP技術進行詳細的介紹,涵蓋ROP的基本概念、Buffer Overflow...

    rop编程入门

    ROP编程,全称Return-Oriented Programming,是一种高级的计算机安全攻击技术。它的核心思想在于利用程序中已存在的指令片段(称为gadgets)来实现攻击者的目的。这些gadgets以ret指令结束,通过巧妙地控制程序的...

    Nguyen:OptiROP——ROP gadgets搜寻神器

    9月25日,SyScan360 2013国际前瞻信息安全会议在北京国家会议中心举行。安全专家Nguyen Anh Quynh同与会者共同探讨《OptiROP:ROP gadgets搜寻神器》这一议题,并现场传授使用OptiROP的方法。

Global site tag (gtag.js) - Google Analytics