为什么80%的码农都做不了架构师?>>>   

针对

--->非开放性平台

--->公司内部产品

接口特点汇总:

1、因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效;

2、因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程;

3、有点接口需要用户登录才能访问;

4、有点接口不需要用户登录就可访问;

针对以上特点,移动端与服务端的通信就需要2把钥匙,即2个token。

第一个token是针对接口的(api_token);

第二个token是针对用户的(user_token);

先说第一个token(api_token)

它的职责是保持接口访问的隐蔽性和有效性,保证接口只能给自家人用,怎么做到?参考思路如下:

按服务器端和客户端都拥有的共同属性生成一个随机串,客户端生成这个串,服务器也按同样算法生成一个串,用来校验客户端的串。

现在的接口基本是mvc模式,URL基本是restful风格,URL大体格式如下:

http://blog.snsgou.com/模块名/控制器名/方法名?参数名1=参数值1&参数名2=参数值2&参数名3=参数值3

接口token生成规则参考如下:

api_token = md5 ('模块名' + '控制器名' + '方法名' + '2013-12-18' + '加密密钥') = 770fed4ca2aabd20ae9a5dd774711de2

其中的

1、 '2013-12-18' 为当天时间,

2、'加密密钥' 为私有的加密密钥,手机端需要在服务端注册一个“接口使用者”账号后,系统会分配一个账号及密码,数据表设计参考如下:

字段名 字段类型 注释
client_id varchar(20) 客户端ID
client_secret varchar(20) 客户端(加密)密钥

(注:只列出了核心字段,其它的再扩展吧!!!)

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

<?php
// 1、获取 GET参数 值
$module = $_GET['mod'];
$controller = $_GET['ctl']
$action = $_GET['act'];
$client_id = $_GET['client_id'];
$api_token = $_GET[''api_token];// 2、根据客户端传过来的 client_id ,查询数据库,获取对应的 client_secret
$client_secret = getClientSecretById($client_id);// 3、服务端重新生成一份 api_token
$api_token_server = md5($module . $controller . $action .  date('Y-m-d', time()) .  $client_secret);// 4、客户端传过来的 api_token 与服务端生成的 api_token 进行校对,如果不相等,则表示验证失败
if ($api_token != $api_token_server) {exit('access deny');  // 拒绝访问
}// 5、验证通过,返回数据给客户端
//。。。
?>

再说第二个token(user_token)

它的职责是保护用户的用户名及密码多次提交,以防密码泄露。

如果接口需要用户登录,其访问流程如下:

1、用户提交“用户名”和“密码”,实现登录(条件允许,这一步最好走https);

2、登录成功后,服务端返回一个 user_token,生成规则参考如下:

user_token = md5('用户的uid' + 'Unix时间戳') = etye0fgkgk4ca2aabd20ae9a5dd77471fgf

服务端用数据表维护user_token的状态,表设计如下:

字段名 字段类型 注释
user_id int 用户ID
user_token varchar(36) 用户token
expire_time int 过期时间(Unix时间戳)

(注:只列出了核心字段,其它的再扩展吧!!!)

服务端生成 user_token 后,返回给客户端(自己存储),客户端每次接口请求时,如果接口需要用户登录才能访问,则需要把 user_id 与 user_token 传回给服务端,服务端接受到这2个参数后,需要做以下几步:

1、检测 api_token的有效性;

2、删除过期的 user_token 表记录;

3、根据 user_id,user_token 获取表记录,如果表记录不存在,直接返回错误,如果记录存在,则进行下一步;

4、更新 user_token 的过期时间(延期,保证其有效期内连续操作不掉线);

5、返回接口数据;

接口用例如下:

1、发布日志

URL:  http://blog.snsgou.com/blog/Index/addBlog?client_id=wt3734wy636dhd3636sr5858t6&api_token=880fed4ca2aabd20ae9a5dd774711de2&user_token=etye0fgkgk4ca2aabd20ae9a5dd77471fgf&user_id=12

请求方式:  POST

POST参数:title=我是标题&content=我是内容

返回数据:

{
      'code' => 1, // 1:成功 0:失败
      'msg' => '操作成功' // 登录失败、无权访问
      'data' => []
}

延伸阅读:

移动端与PHP服务端接口通信流程设计(增强版)

转载于:https://my.oschina.net/boltwu/blog/411153

移动端与PHP服务端接口通信流程设计(基础版)相关推荐

  1. 微信个人号客服系统淘宝客发单机器人sdk服务端接口列表

    微信个人号客服系统淘宝客发单机器人sdk服务端接口列表 case HeartBeatReq: {// 客户端发送的心跳包heartBeatReqHandler.handleMsg(ctx, msgVo ...

  2. app微信支付-java服务端接口 支付/查询/退款

    app微信支付-java服务端接口 支付-查询-退款 个人看微信的文档,看了很多前辈的写法,终于调通了,在这里做一下记录. 首先来定义各种处理类(微信支付不需要特殊jar包,很多处理需要自己封装,当然 ...

  3. 接口-服务端接口客户端接口

    记得刚工作就开始纠结接口这个问题,纠结到现在,总算是从头到尾摸索了一遍. 首先,服务端接口,是指我这个系统作为服务,然后其他的系统来调我.首先,接口,双方会定义一定的规范,即我这个系统,和调用我这个系 ...

  4. 全新版个人博客小程序,无需开发服务端接口即可使用

    介绍: 全新版个人博客小程序,服务端使用的是Bmob后端云,无需开发服务端接口即可使用,快速便捷,代码简洁,功能包括文章列表,文章分类列表,赞赏功能,签到,收藏文章,查看文章,点赞文章,消息通知,评论 ...

  5. RemObjects(一)客户端远程调用服务端接口过程

    RemObjects SDK 是高度封装的产物,对OOP发挥极致. 本文将以RemObjects SDK最简单的DEMO--FirstSample为例, 介绍客户端是如何完成远程调用服务端接口的全过程 ...

  6. SpringBoot 服务端接口公网远程调试,并实现 HTTP 服务监听

    前后端分离项目中,在调用接口调试时候,可以通过cpolar内网穿透将本地服务端接口模拟公共网络环境远程调用调试,本次教程以Java服务端接口为例. 1. 本地环境搭建 1.1 环境参数 JDK1.8 ...

  7. max232c语言,串行口通信(STC89C52+MAX232):串行口通信硬件设计详解

    一. STC89C52与MAX232连接原理图 二. 串行口通信原理 1. 基本通信方式 a. 并行通信 定义: 将数据字节的各位用多条数据线同时进行传送, 每一位数据都需要一条传输线, 还需要一条信 ...

  8. xfire客户端获取xcf服务端接口解析问题

    1.java.lang.ClassCastException: org.apache.xerces.dom.DocumentImpl cannot be cast to java.lang.Strin ...

  9. 手游平台系统搭建sdk服务端接口文档

    一.登录验证 游戏登陆的token验证(游戏方获取user_id和token后访问) 游戏服务器 --> 平台服务器: http://联运平台域名/ 传值方式 POST(参数格式:数组格式) 参 ...

最新文章

  1. 用树莓派做一个alibaba-guest
  2. 使用http://start.spring.io/ 生成springboot工程
  3. innovation
  4. Python_48re模块的sub方法
  5. sql server紧急状态下登录脚本
  6. 边缘计算 ai_在边缘探索AI!
  7. Python 精简入门级学习(一)
  8. Flutter Curves 动画曲线合辑
  9. matlab barh命令,matlab中的bar, barh
  10. 博客园是否提供trackback的rss
  11. ffice 2016 文件运行excel的数据透视表中的数据切片器的时候自动关闭
  12. 在FFMPEG中使用libRTMP的经验
  13. oracle 选择函数,Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
  14. vue watch 经常监听不到_VUE处理 组件赋值 watch 监听不到赋值问题
  15. Gson解析原理概述
  16. 【转】常见问题及应用技巧---------[BIOS篇]
  17. Hibernate基本(笔记)
  18. python语言的就业方向_Python语言就业方向
  19. Windows bat 脚本简单用法
  20. 无法启动此程序因为计算机中丢失d3dcompiler_47.dll

热门文章

  1. 转载 CreateWaitableTimer和SetWaitableTimer函数
  2. Toby Walsh教授:四个指数趋势解释人工智能威胁论!
  3. 《智能路由器开发指南》——1.1 OpenWrt简介
  4. Android打Path的方法
  5. 安装Exchange2013,FMS服务无法达到启动状态
  6. 浅谈Redis与MySQL的耦合性以及利用管道完成MySQL到Redis的高效迁移
  7. 程序员杂记:我们的爱情故事
  8. 给初恋女孩的信....
  9. SpringCloud配置中心-Config
  10. 论文笔记之:Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning