首先需要知道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. LeetCode算法题-Maximum Depth of Binary Tree

    这是悦乐书的第164次更新,第166篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第23题(顺位题号是104).给定二叉树,找到它的最大深度.最大深度是从根节点到最远叶节 ...

  2. June 16. 2018, Week 24th. Saturday

    Success is the ability to go from one failure to another with no loss of enthusiasm. 成功,就是即使经历过一个又一个 ...

  3. nginx 学习笔记

    Nginx是一个自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作 ...

  4. 在 Linux 中自动配置 IPv6 地址

    在 Linux 中自动配置 IPv6 地址 在本文中,我们将学习如何为 ULA 自动配置 IP 地址. 何时使用唯一本地地址 唯一本地地址unique local addresses(ULA)使用 f ...

  5. 关于 chrome canary X64 在 win7 64bit 下面缺少openvr_api.dll的解决方法

    在github上下载openvr_api.dll放到chrome的安装目录下就可以. 其实放到系统目录下最好,以后其他程序要使用的时候也能使用的到. https://github.com/ValveS ...

  6. LeetCode练习3 找出一个字符串中最大不重复子字符串的长度

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  7. 2-jsp简介

    一.什么是jsp:1.只能运行在服务器中2.可以将java代码嵌入html页面中的技术 补充:在eclipse中修改jsp的创建模板 window--preference--web--jsp file ...

  8. Topshelf:一款非常好用的 Windows 服务开发框架 转发https://www.cnblogs.com/happyframework/p/3601995.html

    背景 多数系统都会涉及到“后台服务”的开发,一般是为了调度一些自动执行的任务或从队列中消费一些消息,开发 windows service 有一点不爽的是:调试麻烦,当然你还需要知道 windows s ...

  9. Spring Security(六):2.3 Release Numbering

    It is useful to understand how Spring Security release numbers work, as it will help you identify th ...

  10. java将秒转换为时分秒工具类

    需要一个接收时分秒的对象,如下: package com.dq.schoolcontract.utils; import com.sun.media.jfxmedia.control.VideoRen ...