对外开放api接口设计(对外开放api接口设计方案)

网友投稿 702 2023-01-30

本篇文章给大家谈谈对外开放api接口设计,以及对外开放api接口设计方案对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享对外开放api接口设计的知识,其中也会对对外开放api接口设计方案进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何对外开放api接口 csdn

标识为的接口为高级接口,需要申请才可以调用,申请方式请见高级接口申请
标识为的接口为开放接口,不需要用户授权就可以调用
用户接口
user/getemail 获取用户的邮箱
user/getinfo 获取用户基本资料
user/getmobile 获取用户的手机
user/getavatar 批量获取用户的头像
博客接口
blog/getinfo 获取博主基本信息
blog/getstats 获取博主的统计信息
blog/getmedal 获取博主的勋章
blog/getcolumn 获取博主的专栏
blog/getarticlelist 获取博主的文章列表
blog/getarticle 获取文章内容
blog/getcategorylist 获取博主的自定义分类
blog/gettaglist 获取博主使用过的的标签
blog/getcommentlist 获取博主收到的评论
blog/getmycommentlist 获取博主发出的评论
blog/getarticlecomment 获取文章的评论
blog/saveinfo 修改博主信息
blog/savearticle 发表/修改文章
blog/postcomment 发表评论
blog/getnewarticlelist 获取博客最新文章
blog/gethomenewest 获取首页最新文章
blog/getexpertlist 获取博客专家
blog/getcolumnlist 获取专栏列表
blog/getcolumndetails 获取专栏信息
blog/getcolumnarticles 获取专栏的文章
blog/getchannel 获取博客系统分类
论坛接口
bbs/gettopics 获取板块最新帖子列表
bbs/gettopicdetails 获取帖子详细内容
bbs/posttopic 发布帖子
bbs/postreply 回复帖子
bbs/getreplies 获取回复列表
bbs/getreplyusers

开放平台API接口安全性设计——微信支付为例

API接口,类似 http://mypay.com/refund/order_id=123mch_id=123 ,这个请求我以商户mch_id=123的身份给订单号为order_id=123退款,如果服务器不辩别请求发起者的身份直接做相应的操作,那是及其危险的。

一般的,在PC端,我们是通过加密的cookie来做会员的辨识和维持会话的;但是cookie是属于浏览器的本地存储功能。APP端不能用,所以我们得通过token参数来辨识会员;而这个token该如何处理呢?
延伸开来,接口的安全性主要围绕Token、Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用。

一般来说,在前端对数据做加密或者前面,是不现实的。前后端使用HTTP协议进行交互的时候,由于HTTP报文为明文,所以通常情况下对于比较敏感的信息可以通过在前端加密,然后在后端解密实现"混淆"的效果,避免在传输过程中敏感信息的泄露(如,密码,证件信息等)。不过前端加密只能保证传输过程中信息是‘混淆’过的,对于高手来说,打个debugger,照样可以获取到数据,并不安全,所谓的前端加密只是稍微增加了攻击者的成本,并不能保证真正的安全。即使你说在前端做了RSA公钥加密,也很有可能被高手获取到公钥,并使用该公钥加密数据后发给服务端,所以务必认为前端的数据是不可靠的,服务端要加以辩别。敏感信息建议上https。

所以一般建议上https,敏感信息md5混淆,前端不传输金额字段,而是传递商品id,后端取商品id对应的金额,将金额等参数加签名发送到支付系统。金额可以是明文的。

token授权机制 :用户使用用户名密码登录后,后台给客户端返回一个token(通常是UUID),并将Token-UserId键值对存储在redis中,以后客户端每次请求带上token,服务端获取到对应的UserId进行操作。如果Token不存在,说明请求无效。
弊端 :token可以被抓包获取,无法预防MITM中间人攻击

用户每次请求都带上当前时间的时间戳timestamp,服务器收到请求后对比时间差,超过一定时长(如5分钟),则认为请求失效。时间戳超时机制是防御DOS攻击的有效手段。

将token,timestamp等其他参数以字典序排序,再加上一个客户端私密的唯一id(这种一般做在服务端,前端无法安全保存这个id)或使用私钥签名,将前面的字符串做MD5等加密,作为sign参数传递给服务端。

地球上最重要的加密算法:非对称加密的RSA算法。公钥加密的数据,可以用私钥解密;私钥签名(加密)的数据,可以用公钥验签。

RSA原理是对极大整数做因数分解,以下摘自维基百科。

暂时比较忙没时间,将于7月29日晚更新。
来更新啦。
微信支付安全规范,可以查看官方文档 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
第1点中,其签名算法最重要的一步,是在最后拼接了商户私密的API密钥,然后通过md5生成签名,这时即使金额是明文也是安全的,如果有人获取并修改了金额,但是签名字段他是无法伪造的,因为他无法知道商户的API密钥。当然,除了微信支付的拼接API生成签名的方法,我们也可以通过java自带的security包进行私钥签名。其中nonce随机字符串,微信支付应该做了校验,可以防止重放攻击,保证一次请求有效,如果nonce在微信支付那边已经存在,说明该请求已执行过,拒绝执行该请求。

阮一峰老师的博客-RSA算法原理: http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
维基百科: https://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95

如何设计API接口,请求接口时需要进行身份验证,防止第三方随意调用接口?

1. 设定一个密钥比如key = ‘2323dsfadfewrasa3434'。
2. 这个key 只有发送方和接收方知道。
3. 调用时对外开放api接口设计,发送方,组合各个参数用密钥 key按照一定对外开放api接口设计的规则(各种排序,MD5,ip等)生成一个access_key。一起post提交到API接口。
4. 接收方拿到post过来的参数以及这个access_key。也和发送一样,用密钥key 对各个参数进行一样的规则(各种排序,MD5,ip等)也生成一个access_key2。
5. 对比access_key 和access_key2 。一样。则允许操作,不一样,报错返回或者加入黑名单。

如何设计出一些优雅的API接口

1. 拼写要准确
接口函数一旦发布就不能改了,要保持兼容性,拼写错误也不能改了,所以要仔细检查拼写,否则会被同行嘲笑很多年。
著名悲剧:unix 的 creat
2. 不仅是英文单词不要拼错,时态也不要错。
比如:
返回bool的判断函数,单数要用 is 复数要用are,这样你的命名就和文档中的描述保持了一致性。
表示状态的变量或者函数要注意时态,比如 onXxxxChanged 表示xxx已经变化了,isConnecting表示正在连接。
正确的时态可以给使用者传递更丰富的信息。
3. 函数最好是动宾结构
动宾结构就是 doSomething,这样的函数命名含义明确
比如: openFile, allocBuffer, setName
如果这个函数的动词宾语就是这个对象本身,那么可以省略掉宾语
4. 属性命名最好是定语+名词
比如 fileName, maxSize, textColor
5. 不要用生僻单词,这不是秀英语的地方,也不要用汉语拼音
比如:rendezvous,估计大多数人要去查词典才知道什么意思,这个词源自法语,是约会的意思。
Symbian OS里有个用它命名的函数,开发Symbian的是英国人,也许人家觉得很平常吧,反正我是查了词典才知道的。
6. 不要自己发明缩写
除非是约定俗成已经被广泛使用的缩写,否则老老实实用完整拼写。
坏例子: count-cnt, manager-mngr password-pw button-btn
现代的IDE都有很好的自动完成功能,名字长一点没关系的,可读性更重要。
7. 保持方法的对称性,有些方法一旦出现就应该是成对的,
比如 有open就要有close,有alloc就要有free,有add就要有remove,这些单词基本是固定搭配的,使用者就很容易理解。
如果 open对应clear就有点让人困惑了。

API 设计规范

设计时通过将请求和响应之间的不同部分隔离来让事情变得简单。保持简单的规则让我们能更关注在一些更大的更困难的问题上。

请求和响应将解决一个特定的资源或集合。使用路径(path)来表明身份,body来传输内容(content)还有头信息(header)来传递元数据(metadata)。查询参数同样可以用来传递头信息的内容,但头信息是首选,因为他们更灵活、更能传达不同的信息。

所有的访问API行为,都需要用TLS通过安全连接来访问。没有必要搞清或解释什么情况需要TLS 什么情况不需要TLS,直接强制任何访问都要通过 TLS。

理想状态下,通过拒绝所有非TLS请求,不响应http或80端口的请求以避免任何不安全的数据交换。如果现实情况中无法这样做,可以返回403 Forbidden响应。

把非TLS的请求重定向(Redirect)至TLS连接是不明智的,这种含混/不好的客户端行为不会带来明显好处。依赖于重定向的客户端访问不仅会导致双倍的服务器负载,还会使 TLS 加密失去意义,因为在首次非TLS调用时,敏感信息就已经暴露出去了。

制定版本并在版本之间平缓过渡对于设计和维护一套API是个巨大的挑战。所以,最好在设计之初就使用一些方法来预防可能会遇到的问题。

为了避免API的变动导致用户使用中产生意外结果或调用失败,最好强制要求所有访问都需要指定版本号。请避免提供默认版本号,一旦提供,日后想要修改它会相当困难。

最适合放置版本号的位置是头信息(HTTP Headers),在 Accept 段中使用自定义类型(contenttype)与其他元数据(metadata)一起提交。例如:

在所有返回的响应中包含ETag头信息,用来标识资源的版本。这让用户对资源进行缓存处理成为可能,在后续的访问请求中把If-None-Match头信息设置为之前得到的ETag值,就可以侦测到已缓存的资源是否需要更新。

为每一个请求响应包含一个Request-Id头,并使用UUID作为该值。通过在客户端、服务器或任何支持服务上记录该值,它能为我们提供一种机制来跟踪、诊断和调试请求。

一个大的响应应该通过多个请求使用Range头信息来拆分,并指定如何取得。详细的请求和响应的头信息(header),状态码(status code),范围(limit),排序(ordering)和迭代(iteration)等,参考 Heroku PlatformAPI discussion of Ranges .

在 PUT/PATCH/POST 请求的正文(request bodies)中使用JSON格式数据,而不是使用form 表单形式的数据。这与我们使用JSON格式返回请求相对应,例如:

资源名 (Resource names):使用复数形式为资源命名,除非这个资源在系统中是单例的 (例如,在大多数系统中,给定的用户帐户只有一个)。 这种方式保持了特定资源的统一性。

行为 (Actions):好的末尾不需要为资源指定特殊的行为,但在特殊情况下,为某些资源指定行为却是必要的。为了描述清楚,在行为前加上一个标准的actions对外开放api接口设计

例如对外开放api接口设计

为了和域名命名规则保持一致,使用小写字母并用 - 分割路径名字,例如:

属性也使用小写字母,但是属性名要用下划线 _ 分割,以便在Javascript****中省略引号。例如:

在某些情况下,让用户提供ID去定位资源是不方便的。例如,一个用户想取得他在Heroku平台app信息,但是这个app的唯一标识是UUID。这种情况下,你应该支持接口通过名字和ID都能访问,例如:

不要只接受使用名字而放弃了使用id。

在一些有父路径/子路径嵌套关系的资源数据模块中,路径可能有非常深的嵌套关系,例如:

推荐在根(root)路径下指定资源来限制路径的嵌套深度。使用嵌套指定范围的资源。在上述例子中,dyno属于app,app属于org可以表示为:

为每一次的响应返回合适的HTTP状态码。好的响应应该使用如下的状态码:

200: GET请求成功,及DELETE或PATCH同步请求完成,或者PUT同步更新一个已存在的资源;

201: POST同步请求完成,或者PUT同步创建一个新的资源;

202: POST,PUT,DELETE,或PATCH请求接收,将被异步处理;

206: GET 请求成功,但是只返回一部分;

使用身份认证(authentication)和授权(authorization)错误码时需要注意:

401 Unauthorized: 用户未认证,请求失败;

403 Forbidden: 用户无权限访问该资源,请求失败;

当用户请求错误时,提供合适的状态码可以提供额外的信息:

422 Unprocessable Entity: 请求被服务器正确解析,但是包含无效字段;

429 Too Many Requests: 因为访问频繁,你已经被限制访问,稍后重试;

500 Internal Server Error: 服务器错误,确认状态并报告问题.

对于用户错误和服务器错误情况状态码,参考: ** **HTTP response code spec

提供全部可显现的资源表述 (例如:这个对象的所有属性) ,当响应码为200或是201时返回所有可用资源,包含 PUT/PATCH和 DELETE 请求,例如:

当请求状态码为202时,不返回所有可用资源,例如:

在默认情况给每一个资源一个id属性。除非有更好的理由,否则请使用UUID。不要使用那种在服务器上或是资源中不是全局唯一的标识,尤其是自动增长的id。

生成小写的UUID格式 8-4-4-4-12,例如:

为资源提供默认的创建时间 created_at 和更新时间 updated_at,例如:

有些资源不需要使用时间戳那么就忽略这两个字段。

仅接受和返回UTC格式的时间。ISO8601格式的数据,例如:

使用嵌套对象序列化外键关联,例如:

而不是像这样:

这种方式尽可能的把相关联的资源信息内联在一起,而不用改变资源的结构,或者引入更多的顶层字段,例如:

响应错误的时,生成统一的、结构化的错误信息。包含一个机器可读的错误 id,一个人类可读的错误信息(message),根据情况可以添加一个url来告诉客户端关于这个错误的更多信息以及如何去解决它,例如:

文档化错误信息格式,以及客户端可能遇到的错误信息id。

客户端的访问速度限制可以维护服务器的良好状态,保证为其他客户端请求提供高性的服务。你可以使用 token bucket algorithm 技术量化请求限制。

为每一个带有RateLimit-Remaining响应头的请求,返回预留的请求tokens。

请求中多余的空格会增加响应大小,而且现在很多的HTTP客户端都会自己输出可读格式("prettify")的JSON。所以最好保证响应JSON最小化,例如:

而不是这样:

你可以提供可选的方式为客户端提供更详细可读的响应,使用查询参数(例如:?pretty=true)或者通过Accept头信息参数(例如:Accept:application/vnd.heroku+json;version=3; indent=4;)。

提供一个机器可读的模式来恰当的表现你的API。使用 prmd 管理你的模式,并且确保用prmd verify验证是有效的。

提供人类可读的文档让客户端开发人员可以理解你的API。

如果你用prmd创建了一个概要并且按上述要求描述,你可以为所有节点很容易的使用prmd doc生成Markdown文档。

除了节点信息,提供一个API概述信息:

提供可执行的示例让用户可以直接在终端里面看到API的调用情况,最大程度的让这些示例可以简单的使用,以减少用户尝试使用API的工作量。例如:

如果你使用 prmd 生成Markdown文档,每个节点都会自动获取一些示例。

描述您的API的稳定性或是它在各种各样节点环境中的完备性和稳定性,例如:加上原型版(prototype)/开发版(development)/产品版(production)等标记。

更多关于可能的稳定性和改变管理的方式,查看 ** **Heroku API compatibility policy

一旦你的API宣布产品正式版本及稳定版本时,不要在当前API版本中做一些不兼容的改变。如果你需要,请创建一个新的版本的API。

关于对外开放api接口设计和对外开放api接口设计方案的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 对外开放api接口设计的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于对外开放api接口设计方案、对外开放api接口设计的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决IDEA占用C盘空间过大的问题
下一篇:解决IDEA target文件夹越来越大的问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~