App架构接口”安全机制”的设计

现在,大部分App的接口都采用RESTful架构,RESTFul最重要的一个设计原则就是,客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息。实现上,大部分都采用token的认证方式,一般流程是:

  1. 用户用密码登录成功后,服务器返回token给客户端;
  2. 客户端将token保存在本地,发起后续的相关请求时,将token发回给服务器;
  3. 服务器检查token的有效性,有效则返回数据,若无效,分两种情况:
    • token错误,这时需要用户重新登录,获取正确的token
    • token过期,这时客户端需要再发起一次认证请求,获取新的token

然而,此种验证方式存在一个安全性问题:当登录接口被劫持时,黑客就获取到了用户密码和token,后续则可以对该用户做任何事情了。用户只有修改密码才能夺回控制权。

如何优化呢?第一种解决方案是采用HTTPS。HTTPS在HTTP的基础上添加了SSL安全协议,自动对数据进行了压缩加密,在一定程序可以防止监听、防止劫持、防止重发,安全性可以提高很多。不过,SSL也不是绝对安全的,也存在被劫持的可能。另外,服务器对HTTPS的配置相对有点复杂,还需要到CA申请证书,而且一般还是收费的。而且,HTTPS效率也比较低。一般,只有安全要求比较高的系统才会采用HTTPS,比如银行。而大部分对安全要求没那么高的App还是采用HTTP的方式。

我们目前的做法是给每个接口都添加签名。给客户端分配一个密钥,每次请求接口时,将密钥和所有参数组合成源串,根据签名算法生成签名值,发送请求时将签名一起发送给服务器验证。类似的实现可参考OAuth1.0的签名算法。这样,黑客不知道密钥,不知道签名算法,就算拦截到登录接口,后续请求也无法成功操作。不过,因为签名算法比较麻烦,而且容易出错,只适合对内的接口。如果你们的接口属于开放的API,则不太适合这种签名认证的方式了,建议还是使用OAuth2.0的认证机制。

我们也给每个端分配一个appKey,比如Android、iOS、微信三端,每个端分别分配一个appKey和一个密钥。没有传appKey的请求将报错,传错了appKey的请求也将报错。这样,安全性方面又加多了一层防御,同时也方便对不同端做一些不同的处理策略。

另外,现在越来越多App取消了密码登录,而采用手机号+短信验证码的登录方式,我在当前的项目中也采用了这种登录方式。这种登录方式有几种好处:

  1. 不需要注册,不需要修改密码,也不需要因为忘记密码而重置密码的操作了;
  2. 用户不再需要记住密码了,也不怕密码泄露的问题了;
  3. 相对于密码登录其安全性明显提高了。

接口的数据一般都采用JSON格式进行传输,不过,需要注意的是,JSON的值只有六种数据类型:

  • Number:整数或浮点数
  • String:字符串
  • Boolean:true 或 false
  • Array:数组包含在方括号[]中
  • Object:对象包含在大括号{}中
  • Null:空类型

所以,传输的数据类型不能超过这六种数据类型。以前,我们曾经试过传输Date类型,它会转为类似于"2016年1月7日 09时17分42秒 GMT+08:00"这样的字符串,这在转换时会产生问题,不同的解析库解析方式可能不同,有的可能会转乱,有的可能直接异常了。要避免出错,必须做特殊处理,自己手动去做解析。为了根除这种问题,最好的解决方案是用毫秒数表示日期。

另外,以前的项目中还出现过字符串的"true"和"false",或者字符串的数字,甚至还出现过字符串的"null",导致解析错误,尤其是"null",导致App奔溃,后来查了好久才查出来是该问题导致的。这都是因为服务端对数据没处理好,导致有些数据转为了字符串。所以,在客户端,也不能完全信任服务端传回的数据都是对的,需要对所有异常情况都做相应处理。

服务器返回的数据结构,一般为:

{
    code:0,
    message: "success",
    data: { key1: value1, key2: value2, ... }
}
  • code: 返回码,0表示成功,非0表示各种不同的错误
  • message: 描述信息,成功时为"success",错误时则是错误信息
  • data: 成功时返回的数据,类型为对象或数组

接口版本的设计

接口不可能一成不变,在不停迭代中,总会发生变化。接口的变化一般会有几种:

  • 数据的变化,比如增加了旧版本不支持的数据类型
  • 参数的变化,比如新增了参数
  • 接口的废弃,不再使用该接口了

为了适应这些变化,必须得做接口版本的设计。实现上,一般有两种做法:

  1. 每个接口有各自的版本,一般为接口添加个version的参数。
  2. 整个接口系统有统一的版本,一般在URL中添加版本号,比如http://api.domain.com/v2。

大部分情况下会采用第一种方式,当某一个接口有变动时,在这个接口上叠加版本号,并兼容旧版本。App的新版本开发传参时则将传入新版本的version。

如果整个接口系统的根基都发生变动的话,比如微博API,从OAuth1.0升级到OAuth2.0,整个API都进行了升级。

有时候,一个接口的变动还会影响到其他接口,但做的时候不一定能发现。因此,最好还要有一套完善的测试机制保证每次接口变更都能测试到所有相关层面。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于这是一个相对较为复杂的项目,本文只能提供一些概括性的建议,具体的设计和实现还需要根据实际情况进行具体思考。 1. 系统架构设计 系统架构是整个项目的核心,必须先进行详细的分析。具体来说,需要考虑以下方面: - 功能模块:根据业务需求,将整个系统分割成不同的模块,例如用户管理、商品管理、交易管理等等。每个模块应该有明确的职责和功能,模块之间的关系和交互应该清晰明了。 - 技术选型:根据功能模块的需求,选定适合的技术和平台。例如,前端可以选择React、Vue等框架;后端可以选择Java、Python等语言;同时需要确定具体的数据库系统、缓存方案、消息队列等基础设施。 - 系统拆分:将整个系统拆分成多个服务,每个服务独立部署和运行,提高系统的可伸缩性和可维护性。一般可以按照业务模块划分服务,同时需要考虑服务之间的通信和调用方式。 - 安全设计:在系统架构设计阶段就应该考虑安全问题,确定安全策略和措施。例如,可以采用OAuth 2.0框架实现身份认证和授权,加密敏感数据传输,对接口进行限流和防刷处理等等。 2. 数据库分析 数据库设计是整个系统的基础,需要考虑以下方面: - 数据库模型:根据业务需求和系统架构设计确定数据库模型。需要注意的是,数据库的表设计应该符合范式,具有高效的查询性能和正确性。 - 数据库类型:根据业务需求和数据量大小选取适当的数据库类型,例如,可以选择关系型数据库MySQL或者NoSQL数据库MongoDB等。 - 数据库性能优化:对于大规模的数据存储需求,需要对数据库进行性能优化。可以通过分库分表、索引优化、缓存优化等方式来提高数据库的读写性能。 3. 界面设计 界面设计是整个系统与用户交互的界面,需要符合用户使用习惯和体验。具体来说,需要考虑以下方面: - 用户界面:根据功能模块和业务流程,设计相应的用户界面。需要考虑用户视觉体验和操作便捷性,保证系统的易用性和用户满意度。 - 响应式布局:随着移动设备的普及,需要考虑实现响应式布局,使得用户界面可以适配不同屏幕大小和不同的设备类型。 - 统一设计:整个系统的界面设计需要有统一的风格和颜色,保持一致性和美观性。 4. 安全设计 安全设计是整个系统的必要部分,需要考虑以下方面: - 用户身份认证:采用OAuth 2.0等身份认证框架,实现用户身份认证和授权。可以采用token等机制来保证用户安全。 - 数据安全:对于重要的数据需要进行加密传输和存储,采用对称加密、非对称加密等技术保证数据的安全性。 - 接口安全:对于系统接口,需要进行限流、防刷和防抓取等方面的处理,防止黑客攻击和非法入侵。 总的来说,二手交易APP系统架构设计,数据库分析,界面设计安全设计需要从各个方面进行综合思考和考虑,确保整个系统能够高效、灵活地运行,同时保证系统安全性和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值