首先需要知道API是什么?
 
API(Application Programming Interface)即应用程序接口。你可以认为 API 是一个软件组件或是一个 Web 服务与外界进行的交互的接口。而我们在这里要谈论的,是作为一家公司如何跟外界进行交互。从另一个角度来说,API 是一套协议,规定了我们与外界的沟通方式:如何发送请求和接收响应。
 
API的特点
 
  1、因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效;
 
  2、因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程;
 
  3、接口分为需要用户登录才能访问的和不需要用户登录就可访问的;
 
针对以上特点,移动端与服务端的通信就需要两种不同的TOKEN,一种针对接口的api_token,一种针对用户的user_token;
 
一.api_token
 
  它的职责是保持接口访问的隐蔽性和有效性,保证接口只有可信任的来源才可以访问,参考思路如下:
 
  按服务器端和客户端都拥有的共同属性生成一个随机串,客户端生成这个串,服务器也按同样算法生成一个串,用来校验客户端的串。
 
  现在的接口基本是mvc模式,URL基本是restful风格,URL大体格式如下:
 
  http://www.api.com/模块名/控制器名/方法名?参数名1=参数值1&参数名2=参数值2
 
  接口token生成规则参考如下:
 
    $api_token = md5 ('模块名' + '控制器名' + '方法名' + '2018-1-18' + '加密密钥') = 789fed3842aabd834e9a5dd7735532de2
 
    1.'2018-1-18' 为当天时间
 
    2.'加密密钥'为私有的加密密钥,手机端需要在服务端注册一个“接口使用者”账号后,系统会分配一个账号及密码,数据表设计参考如下:
 
      字段名及字段类型
 
       

 client_id  varchar(20) 客户端ID

 client_secret varchar(20) 客户端(加密)密钥

  

 
      服务端接口校验,PHP实现流程如下:
 
<?php

    //获取GET参数值

    $module = $_GET['module'];

    $controller = $_GET['controller']

    $action = $_GET['action'];

    $client_id = $_GET['client_id'];

    $api_token = $_GET[''api_token];

    //根据客户端传过来的client_id,查询数据库,获取对应的client_secret

    $client_secret = getClientSecret($client_id);

    //服务端重新生成一个api_token

    $api_token_server = md5($module . $controller . $action . date('Y-m-d', time()) . $client_secret);

    //客户端传过来的api_token与服务端生成的api_token进行校对,如果不相等,则表示验证失败

    if ($api_token != $api_token_server) {

        exit('access deny'); //拒绝访问

    }

    //验证通过,返回数据给客户端

?>    
 
二.user_token
 
  它的职责是保护用户的用户名及密码多次提交,以防密码泄露。
 
  如果接口需要用户登录,其访问流程如下:
 
    1、用户提交“用户名”和“密码”,实现登录(条件允许,这一步最好走https);
 
    2、登录成功后,服务端返回一个user_token,生成规则参考如下:
 
      user_token = md5('用户的uid' + 'Unix时间戳') = etye0fgkgk4ca2ttdsl0ae9a5dd77471fgf
 
      服务端用数据表维护user_token的状态,表设计如下:
 
      字段名及字段类型如下:
 
        

     user_id int(11) 用户ID

   user_token varchar(36) 用户token

   expire_time int 过期时间(Unix时间戳)

  

 
  服务端生成user_token后,返回给客户端(自己存储),客户端每次接口请求时,如果接口需要用户登录才能访问,则需要把 user_id与user_token传回给服务端,服务端接受到这2个参数后,需要做以下几步:
 
      1、检测user_token的有效性;
 
    2、删除过期的user_token表记录;
 
    3、根据user_id,user_token 获取表记录,如果表记录不存在,直接返回错误,如果记录存在,则进行下一步;
 
    4、更新user_token 的过期时间(延期,保证其有效期内连续操作不掉线);
 
    5、返回接口数据;
 
接口用例如下:添加测试接口
 
URL: http://www.api.com/demo/index/add-demo?client_id=wt373uesksklwkskx36sr5858t6&api_token=880fed4ca2aabd20ae9eessa74711de2&user_token=etye0fgkgk4ca2asehxlejeje5dd77471fgf&user_id=12

请求方式: POST

POST参数:title=哈喽&content=我的世界

返回数据:

{

    'code' => 1, // 1:成功 0:失败

    'msg' => '成功/失败,无权访问'

    'data' => []

}

  

API接口TOKEN设计的更多相关文章

  1. 防盗链&CSRF&API接口幂等性设计

    防盗链技术 CSRF(模拟请求) 分析防止伪造Token请求攻击 互联网API接口幂等性设计 忘记密码漏洞分析 1.Http请求防盗链 什么是防盗链 比如A网站有一张图片,被B网站直接通过img标签属 ...

  2. api接口token验证

    接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程: 3.有点接口需要用户登录 ...

  3. Java++:安全|API接口安全性设计

    接口的安全性主要围绕 token.timestamp 和 sign 三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看: Token授权机制: 用户使用用户名密码登录后服务器给客户端返 ...

  4. API接口安全性设计

    http://www.jianshu.com/p/c6518a8f4040 接口的安全性主要围绕Token.Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来 ...

  5. API接口幂等性设计

    目录 幂等性场景 解决方案 幂等性场景 网络延迟导致多次重复提交. 表单重复提交. 解决方案 每次提交都使用一个Token,Token保证临时且唯一即可 token生成规则(单机应用):token+U ...

  6. php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

    2016年12月29日13:45:27    关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充   说道接口设计第一反应就是r ...

  7. 程序员不得不知道的 API 接口常识

    说实话,我非常希望两年前刚准备找实习的自己能看到本篇文章,那个时候懵懵懂懂,跟着网上的免费教程做了一个购物商城就屁颠屁颠往简历上写. 至今我仍清晰地记得,那个电商教程是怎么定义接口的: 管它是增加.修 ...

  8. springboot+jwt做api的token认证

    本篇和大家分享jwt(json web token)的使用,她主要用来生成接口访问的token和验证,其单独结合springboot来开发api接口token验证很是方便,由于jwt的token中存储 ...

  9. 关于网易云音乐爬虫的api接口?

    抓包能力有限,分析了一下网易云音乐的一些api接口,但是关于它很多post请求都是加了密,没有弄太明白.之前在知乎看到过一个豆瓣工程师写的教程,但是被投诉删掉了,请问有网友fork了的吗?因为我觉得他 ...

随机推荐

  1. vue 之 .sync 修饰符

    在一些情况下,我们可能会需要对一个 prop (父子组件传递数据的属性) 进行“双向绑定”. 在vue 1.x 中的 .sync 修饰符所提供的功能.当一个子组件改变了一个带 .sync 的prop的 ...

  2. Linux 小知识翻译 - 「SCP和SFTP」

    这次想说说「SCP和SFTP」. 不管SCP还是SFTP,都是SSH的功能之一.都是使用SSH协议来传输文件的. 不用说文件内容,就是登录时的用户信息都是经过SSH加密后才传输的,所以说SCP和SFT ...

  3. February 11th, 2018 Week 7th Sunday

    Grasp all, lose all. 欲尽得,必尽失. Not to be greedy and not to try to get everything. Our time, energy an ...

  4. Python里面search()和match()的区别

    转自https://www.cnblogs.com/aaronthon/p/9435967.html match()函数只检测字符串开头位置是否匹配,匹配成功才会返回结果,否则返回None searc ...

  5. 《Java大学教程》—第12章 案例研究--第2部分

    本章就是上一章的延续,主要是用GUI实现了控制界面. 编程练习:代码附件Hostel.java1.    正确运行2.    Runhostel.java3.    searchButton

  6. wangedit

    <template> <el-row id="AddRoom"> <el-col :span="5">.</el-co ...

  7. Nginx使用教程(六):使用Nginx缓存之FastCGI缓存

    启用FastCGI缓存 <br\>编辑必须启用缓存的虚拟主机配置文件. nano /etc/nginx/sites-enabled/vhost 将以下行添加到server{}指令之外的文件 ...

  8. (转)Spring Boot (十九):使用 Spring Boot Actuator 监控应用

    http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html 微服务的特点决定了功能模块的部署是分布式的,大部分功能 ...

  9. Codeforces Round #546 (Div. 2) C. Nastya Is Transposing Matrices

    C. Nastya Is Transposing Matrices time limit per test 1 second memory limit per test 256 megabytes i ...

  10. Java面试知识点之线程篇(一)

    前言:在Java面试中,一定会遇到线程相关问题,因此笔者在这里总结Java中有关线程方面知识点,多数从网上得来(文中会贴出主要参考链接),有些也是笔者在面试中所遇到的问题,如有错误,请不吝指正.主要参 ...