【转载】API权限设计总结
本文内容转自:http://blog.csdn.net/initphp/article/details/8636669
API权限设计总结:
最近在做API的权限设计这一块,做一次权限设计的总结。
1. 假设我们需要访问的API接口是这样的:http://xxxx.com/openapi/v1/get/user/?key=xxxxx&sign=sadasdas×tamp=2013-03-05 10:14:00&c=c&a=a&d=d
2. 接口调用的控制器:openapi/v1/get/user/
3. 步骤一:作为服务端,首先要检查参数是否正确:key (用户的key) ;sign(加密的签名串) ;timestamp (请求的时间,服务端对请求有时间生效),这些参数如果有一个参数没传递,肯定返回参数不正确的结果。
4. 步骤二:参数如果都传递正确,这个时候需要检查API的白名单权限,API也就是(openapi/v1/get/user/)是否存在在我们的数据库中,一般会有一张API的数据表,如果调用的API不在我们的数据库白名单中或者这个API已经关闭访问了,那么要返回禁止访问的结果。
5. 步骤三: 如果API在白名单中,那么现在就要检查用户的KEY是否正确了,服务端会有一张用户权限表,这个数据表主要用来记录用户的key secret(密钥) 以及API权限列表,检查这个用户对访问的API(openapi/v1/get/user/)是否有权限,如果有权限则通过,没权限则关闭。
6. 步骤四: 如果用户权限通过,这个时候就到了最重要的一步,SIGN签名的验证。
签名算法:
加密方式 md5(POST参数(升序排序,除key sign参数除外) + 用户密钥)
PHP加密算法代码:
 foreach ($p as $v) {
             $temp = explode("=", $v);
             $pArr[$temp[0]] = $temp[1];
         }
 ksort($pArr);
         foreach ($pArr as $k => $v) {
             $pStr2 .= $k . $v ;
         }
 md5($pStr2 . $secret)  
注意:加密的时候,需要将timestamp带上,防止客户端篡改。
客户端,将自己需要传递的参数进行升序排序,然后加上自己key对应的密钥(密钥在服务端数据库中有一份保存,这个是不能对外公开的)进行MD5加密,通过参数sign传递到服务端。
服务端拿到sign值后,对传递过来的参数也进行同样的算法排序,并经过用户的key查询得到密钥,然后进行一次加密算法,得到的服务端的sign和客户端传递过来的sign进行比较,如果相同则表示是可以通过的,如果中途有人篡改数据等,那么最终加密出来的sign就是不一致的,这样保证了用户传递数据的可靠性和安全性。
7. 步骤五:检查时间戳时间,比较客户端时间和服务端时间是否在10分钟之内,如果10分钟之外了,那么返回超时的提示,这样能保证调用过的接口数据能在一定时间内销毁掉。
8. 步骤六:调用相应逻辑
API权限设计总结:
最近在做API的权限设计这一块,做一次权限设计的总结。
1. 假设我们需要访问的API接口是这样的:http://xxxx.com/openapi/v1/get/user/?key=xxxxx&sign=sadasdas×tamp=2013-03-05 10:14:00&c=c&a=a&d=d
2. 接口调用的控制器:openapi/v1/get/user/
3. 步骤一:作为服务端,首先要检查参数是否正确:key (用户的key) ;sign(加密的签名串) ;timestamp (请求的时间,服务端对请求有时间生效),这些参数如果有一个参数没传递,肯定返回参数不正确的结果。
4. 步骤二:参数如果都传递正确,这个时候需要检查API的白名单权限,API也就是(openapi/v1/get/user/)是否存在在我们的数据库中,一般会有一张API的数据表,如果调用的API不在我们的数据库白名单中或者这个API已经关闭访问了,那么要返回禁止访问的结果。
5. 步骤三: 如果API在白名单中,那么现在就要检查用户的KEY是否正确了,服务端会有一张用户权限表,这个数据表主要用来记录用户的key secret(密钥) 以及API权限列表,检查这个用户对访问的API(openapi/v1/get/user/)是否有权限,如果有权限则通过,没权限则关闭。
6. 步骤四: 如果用户权限通过,这个时候就到了最重要的一步,SIGN签名的验证。
签名算法:
加密方式 md5(POST参数(升序排序,除key sign参数除外) + 用户密钥)
PHP加密算法代码:
 foreach ($p as $v) {
             $temp = explode("=", $v);
             $pArr[$temp[0]] = $temp[1];
         }
 ksort($pArr);
         foreach ($pArr as $k => $v) {
             $pStr2 .= $k . $v ;
         }
 md5($pStr2 . $secret)  
注意:加密的时候,需要将timestamp带上,防止客户端篡改。
客户端,将自己需要传递的参数进行升序排序,然后加上自己key对应的密钥(密钥在服务端数据库中有一份保存,这个是不能对外公开的)进行MD5加密,通过参数sign传递到服务端。
服务端拿到sign值后,对传递过来的参数也进行同样的算法排序,并经过用户的key查询得到密钥,然后进行一次加密算法,得到的服务端的sign和客户端传递过来的sign进行比较,如果相同则表示是可以通过的,如果中途有人篡改数据等,那么最终加密出来的sign就是不一致的,这样保证了用户传递数据的可靠性和安全性。
7. 步骤五:检查时间戳时间,比较客户端时间和服务端时间是否在10分钟之内,如果10分钟之外了,那么返回超时的提示,这样能保证调用过的接口数据能在一定时间内销毁掉。
8. 步骤六:调用相应逻辑
【转载】API权限设计总结的更多相关文章
- 接口加密《二》: API权限设计总结
		
来源:http://meiyitianabc.blog.163.com/blog/static/105022127201310562811897/ API权限设计总结: 最近在做API的权限设计这一块 ...
 - API权限设计总结
		
最近在做API的权限设计这一块,做一次权限设计的总结. 1. 假设我们需要访问的API接口是这样的:http://xxxx.com/openapi/v1/get/user/?key=xxxxx& ...
 - 认证鉴权与API权限控制在微服务架构中的设计与实现(四)
		
引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的完结篇,前面三篇已经将认证鉴权与API权限控制的流程和主要细节讲解完.本文比较长,对这个系列进行收尾,主要内容包括 ...
 - RBAC 权限设计(转载)
		
来源 :https://blog.csdn.net/rocher88/article/details/43190743 这是我在网上找的一些设计比较好的RBAC权限管理 不知道,像新浪.搜狐.网易.百 ...
 - REST API权限集成设计
		
REST API权限集成设计 应用分为两大部分,前端html+后端Rest服务,前端html和后端Rest服务部署完全分离. 目标:可访问资源都处于权限控制之下(意味着通过浏览器地址栏的任意url都会 ...
 - Atitit.跨语言系统服务管理器api兼容设计
		
Atitit.跨语言系统服务管理器api兼容设计 1. Common api,兼容sc ,service control??1 1.1. 服务创建,use sc1 1.2. 服务delete ,use ...
 - Atitit.会员卡(包括银行卡)api的设计
		
Atitit.会员卡(包括银行卡)api的设计 1. 银行卡的本质是一种商业机构会员卡1 2. 会员卡号结构组成1 2.1. ●前六位是:发行者标识代码 Issuer Identification N ...
 - Web API接口设计经验总结
		
在Web API接口的开发过程中,我们可能会碰到各种各样的问题,我在前面两篇随笔<Web API应用架构在Winform混合框架中的应用(1)>.<Web API应用架构在Winfo ...
 - 优秀的API接口设计原则及方法(转)
		
一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的.如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的 ...
 
随机推荐
- (53)C# 工具
			
https://docs.microsoft.com/zh-cn/dotnet/framework/tools/ildasm-exe-il-disassembler 一.Visual Studio的开 ...
 - ()centos7 安装python36
			
centos7 默认安装 python2.7 1.先安装python36和对应pip yum install python-pip #安装python2的pip yum install python3 ...
 - Java学习之集合(List接口)
			
List特有的常见方法:有一个共性特点:都可以操作角标 1.添加 void add(int index, E element); void addAll(int index, collection& ...
 - 关于cefsharp  获取js动态加载后的信息
			
IFrame frame = null; var identifiers = Browser.GetBrowser().GetFrameIdentifiers(); foreach (var i in ...
 - HDU 1392 Surround the Trees (凸包周长)
			
题目链接:HDU 1392 Problem Description There are a lot of trees in an area. A peasant wants to buy a rope ...
 - C# String类常用操作
			
1.string.Compare(s1,s2) 比较 按字母顺序后边的大于前边的 s1<s2 retrun -1 ;s1=s2 return 0; s1>s2 return1. Cons ...
 - Unity中实现网格轮廓效果,选中边框效果
			
问题背景: 最近要实现选中实体的高亮效果,要那种类似于unity中Outline的效果,网格轮廓高亮效果. 效果图: 具体代码: OutlineEffect.cs 实体高亮效果类: 轮廓边总控制类,该 ...
 - 使用Docker快速部署ELK分析Nginx日志实践
			
原文:使用Docker快速部署ELK分析Nginx日志实践 一.背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前 ...
 - Install .NET Core Runtime on Linux Ubuntu 16.04 x64
			
原文链接https://www.microsoft.com/net/download/linux-package-manager/ubuntu16-04/runtime-current nstall ...
 - idea一直在copying resources或者一直在build,卡住不动,问题已解决
			
IDE在启动项目的过程中,一直copying,或者是build一直卡住,需要在modules中配置下,把target文件夹移出resource folder 同时,在此之前,我还屏蔽了项目中pom.x ...