开放接口/RESTful/Api服务的设计和安全方案

总体思路

这个涉及到两个方面问题:
一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证、来路验证)
一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输、敏感内容加密、数字签名)

用户身份验证:Token与Session
开放接口Api服务其实就是客户端与服务端无状态交互的一种形式,这有点类似REST(Representational State Transfer)风格。
普通网站应用一般使用session进行登录用户信息的存储和验证(有状态),而开放接口服务/REST资源请求则使用Token进行登录用户信息的验证(无状态)。Token更像是一个精简版的session。Session主要用于保持会话信息,会在客户端保存一份cookie来保持用户会话有效性,而Token则只用于登录用户的身份鉴权。所以在移动端使用Token会比使用Session更加简易并且有更高的安全性,同时也更加符合RESTful中无状态的定义。

Token交互流程
客户端通过登录请求提交用户名和密码,服务端验证通过后生成一个Token与该用户进行关联,并将Token返回给客户端。
客户端在接下来的请求中都会携带Token,服务端通过解析Token检查登录状态。
当用户退出登录、其他终端登录同一账号、长时间未进行操作时Token会失效,这时用户需要重新登录。

Token生成原理
服务端生成的Token一般为随机的非重复字符串,根据应用对安全性的不同要求,会将其添加时间戳(通过时间判断Token是否被盗用)或url签名(通过请求地址判断Token是否被盗用)后加密进行传输。一般Token内容包含有:用户名/appid,密码/appsecret, 授权url,用户自定义token(用户自定义签名),时间戳,有效期时长(秒), 系统签名(sign)等。

Api接口服务调用流程:
1. 首先要获取全局唯一的接口调用凭据(access_token)。该过程务必使用https安全传输协议,否则被拦截监听了,用户名和密码等重要数据就都泄漏了。
具体过程:
a. 客户端向服务端通过https协议发送请求,参数包含用户名、密码、请求类型等
b. 服务端接到请求后,验证用户信息是否正确,如果正确,返回access_token和expires。否则返回errorcode和errmsg。
c. 服务端access_token可以存储在session或者redis等内存数据库中,键名(key)为user_id,键值为access_token。
d. 客户端获得access_token后,保存到file或redis等内存数据库中。不推荐保存到session或数据库中,保存到session数据容易丢失,保存到数据库因为涉及IO读写,性能较低。
2. 通过RESTful风格的资源请求格式调用接口,如:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
正常情况下,服务端会返回JSON数据包给调用者,成功则返回包含业务数据内容的JSON数据包,失败则返回包含errcode和errmsg的JSON数据包

对于敏感的api接口,需使用https协议
http叫超文本传输协议,使用TCP端口80,默认情况下数据是明文传送的,数据可以通过抓包工具捕获到,因此在interner上,有些比较重要的站点的http服务器需要使用PKI(公钥基础结构)技术来对数据加密!这也就是https了;
https叫安全的超文本传输协议,使用TCP端口443,他的数据会用PKI中的公钥进行加密,这样抓包工具捕获到的数据包也没有办法看包中的内容,因为他没有密钥,当然篡改也就没有什么意义了,安全性大大提高,要解密数据的话就要用到PKI中的私钥。所以一些安全性比较高的网站如:网上银行,电子商务网站都需要用https访问!

微信access_token设计的原理解析
1. appid:接口身份证号。
2. appsecret:密码。
3. access_token:公众号的全局唯一接口调用凭据,,公众号调用各接口时都需使用access_token。access_token是加密的字符串,其目的是为了接口安全考虑,不然随便就能调用微信服务器的接口会有很大风险。access_token包含的信息有appid, secret, 用户自定义token,授权url,有效时长等。(登陆后的凭据,证明你已经登陆,相当于你拿着票去看演唱会,说明你已经买票了,才会让你进)。
4. expires_in:access_token过期时间,因为这里是第三方服务器调用,所以微信服务器必须返回告知给第三方服务器过期时间,从而让第三方服务器更好处理。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
5. openid:为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,OpenID是使用用户微信号加密后的结果,每个用户对每个公众号有一个唯一的OpenID,开发者可通过OpenID来获取用户基本信息。
6. unionid:用来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的UnionID是唯一的。换句话说,同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。

接口调用请求说明
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
返回说明
正常情况下,微信会返回下述JSON数据包给公众号:
{"access_token":"ACCESS_TOKEN","expires_in":7200} (access_token的存储至少要保留512个字符空间,expires_in单位是秒,有效期目前为2个小时,即7200秒)
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{"errcode":40013,"errmsg":"invalid appid"}

参考文章:
https://www.zhihu.com/question/20863625
http://blog.csdn.net/gebitan505/article/details/39178035
http://www.tuicool.com/articles/jQJV3i
http://www.oschina.net/question/1433358_233412
http://www.lai18.com/content/944366.html
http://blog.csdn.net/gebitan505/article/details/39178917
http://blog.csdn.net/gebitan505/article/details/51614805
http://www.szweb.cn/Knowledge/5714.html


版权声明:本文采用署名-非商业性使用-相同方式共享(CC BY-NC-SA 3.0 CN)国际许可协议进行许可,转载请注明作者及出处。
本文标题:开放接口/RESTful/Api服务的设计和安全方案
本文链接:http://www.cnblogs.com/sochishun/p/7000335.html
本文作者:SoChishun (邮箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
发表日期:2017年6月13日

时间: 2024-12-15 01:42:14

开放接口/RESTful/Api服务的设计和安全方案的相关文章

[CI] 使用CodeIgniter框架搭建RESTful API服务

在2011年8月的时候,我写了一篇博客<使用CodeIgniter框架搭建RESTful API服务>,介绍了RESTful的设计概念,以及使用CodeIgniter框架实现RESTful API的方法.转眼两年过去了,REST在这两年里有了很大的改进.我对于前一篇博客中的某些方面不是很满意,所以希望能利用这次机会写一个更加完善的版本.我的项目基于Phil Sturgeon的CodeIgniter REST Server,遵循他自己的DBAD协议.Phil的这个项目很棒,干净利落,简单实用,并

使用CodeIgniter框架搭建RESTful API服务

使用CodeIgniter框架搭建RESTful API服务 发表于 2014-07-12   |   分类于 翻译笔记   |   6条评论 在2011年8月的时候,我写了一篇博客<使用CodeIgniter框架搭建RESTful API服务>,介绍了RESTful的设计概念,以及使用CodeIgniter框架实现RESTful API的方法.转眼两年过去了,REST在这两年里有了很大的改进.我对于前一篇博客中的某些方面不是很满意,所以希望能利用这次机会写一个更加完善的版本. 我的项目基于P

【重学Node.js 第1&amp;2篇】本地搭建Node环境并起RESTful Api服务

本地搭建Node环境并起RESTful Api服务 课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html 项目github地址:https://github.com/hellozhangran/happy-egg-server 说明:本想分两章讲环境搭建和起api服务,但操作下来确实过于简单.但考虑到整个系列的完整性也不能不讲,那就把这两篇合二为一吧 本地搭建Node环境 开发环境主要是指Node.MongoDB.本人是用的mac电脑,

构建自描述 RESTFul API 体系的设计与畅想

今天的互联网世界,API 已经无处不在,越来越多的服务依赖 API 交换信息,彼此协作,彼此连接,API 开发协作的体验也越来越重要. 有协作,就有沟通,显而易见的方法就是写文档,用文档描述 API 的用途,使用方法.但如何保持文档与代码的同步确是业界的千古难题,能做得到位的寥寥无几. 难道就真的没有方法了吗? 这就是本文的主题,构建自描述 RESTFul API 体系,如何通过自描述的 API 设计,抹除代码与文档的界限,一切皆代码. 何谓自描述 所谓的自描述,就是让 API 在提供具体的功能

Restful API 架构与设计参考原则

1. 什么是RESTREST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一. 他在论文中提到:"我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强.性能好.适宜通信的架构.REST指的是一组架构约束条件和原则." 如果一个架构符合REST的

Go实战--通过gin-gonic框架搭建restful api服务(github.com/gin-gonic/gin)

生命不止,继续 go go go !!! 先插播一条广告,给你坚持学习golang的理由: <2017 软件开发薪酬调查:Go 和 Scala 是最赚钱的语言> 言归正传! 之前写过使用golang实现简单的restful api相关的博客: Go实战–实现简单的restful api(The way to go) 其中,使用了github.com/gorilla/mux,今天要跟大家介绍的是gin-gonic/gin. gin-gonic/gin 介绍: Gin is a HTTP web

基于gin web框架搭建RESTful API服务

这篇主要学习go项目中的项目结构.项目规范等知识,ROM采用的database/sql的写法. 1.技术框架 利用的是ginweb框架,然后ROM层选用database/sql,安装mysql驱动.安装方式如下: //使用github上的gin托管地址 $ go get -u github.com/gin-gonic/gin $ go get github.com/go-sql-driver/mysql 2.项目结构如下 项目结构分析: 1.main.go主要是存放路由,启动项目: 2.rout

微服务之Restful API 设计简述

API的定义取决于选择的IPC通信方式,如果是消息机制(如 AMQP 或者 STOMP),API则由消息频道(channel)和消息类型:如果是使用HTTP机制,则是基于请求/响应(调用http的url),这里我们先简述下RestfulAPI的定义. 设计原则 域名 应该尽量将API部署在专用域名之下,如: https://api.example.com 也可以放在主域名下: https://example.org/api/ 版本 放入到头信息的Accept中 制定版本并在版本之间平缓过渡对于设

Holer实现外网访问本地RESTful API

外网访问内网RESTful API 内网主机上安装了RESTful API服务端程序,只能在局域网内访问,怎样从公网也能访问本地RESTful API? 本文将介绍使用holer实现的具体步骤. 1. 准备工作 1.1 安装并启动RESTful API服务端程序 默认安装的RESTful API服务端软件端口是8088. 2. 实现步骤 2.1 下载并解压holer软件包 Holer软件包:holer-xxx.tar.gz Holer支持各种OS系统平台,请选择跟本地OS类型匹配的holer软件