转载自:http://blog.snsgou.com/post-766.html

--->非开放性平台

--->公司内部产品

接口特点汇总:

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实现流程如下:

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

再说第二个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服务端接口通信流程设计(基础版)的更多相关文章

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

    增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字段类型 注释 api_id int 接口ID api_name varchar(120) 接口名,以"/ ...

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

    前面讲过:移动端与PHP服务端接口通信流程设计(基础版) 对于 api_token 的校验,其安全性还可再增强: 增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字 ...

  3. 移动端与PHP服务端接口通信流程设计(基础版)

    针对 --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行 ...

  4. api服务端接口安全

    api服务端接口安全性解析 http://blog.csdn.net/tenfyguo/article/details/8225279 常用的基于token的实现方案 http://blog.csdn ...

  5. 【规范建议】服务端接口返回字段类型与iOS端的解析

    一.本文档的写作目的 App需要跟产品.UI.后台.服务器.测试打交道,app的产出是其他端人员产出的综合体现.与其他端人员沟通就像是开发写接口,也就是面向接口编程的思想. 本文档讲解针对的是服务端返 ...

  6. 基于CXF框架下的SOAP Webservice服务端接口开发

    最近对webservice 进行入门学习,网上也是找了很多的学习资料.总得感觉就是这了解点,那了解点.感觉不够系统,不够容易入门.差不多断断续续看了一个星期了,今天小有成果,把客户端,服务端都搞定了. ...

  7. App架构设计经验谈:服务端接口的设计

    App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 安全机制的设计 现在,大部分App的接口都采用RESTful架构,RESTFul最重要的 ...

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

    个人不怎么看得懂微信的文档,看了很多前辈的写法,终于调通了,在这里做一下记录. 首先来定义各种处理类(微信支付不需要特殊jar包,很多处理需要自己封装,当然也可以自己写完打个jar包) 参数要用jdo ...

  9. springboot(服务端接口)获取URL请求参数的几种方法

    原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 一.下面为7种服务端获取前端传过来的参数的方法  常用的方法为:@RequestParam和@Req ...

随机推荐

  1. Element-ui 使用详细介绍

    一.后台搭建 使用 vue-admin-template 来快速搭建后台管理,它包含了 Element UI & axios & iconfont & permission c ...

  2. 破解mysql

    https://blog.csdn.net/lian_easel/article/details/78734240 破解mysql

  3. 剑指offer-顺序打印二叉树节点(系列)-树-python

    转载自  https://blog.csdn.net/u010005281/article/details/79761056 非常感谢! 首先创建二叉树,然后按各种方式打印: class treeNo ...

  4. 《CSS权威指南》双鱼书概述——第一章CSS和文档

    前言:CSS即层叠样式表 主要是影响一个或者一组文档的表现,没有文档,CSS毫无用处. 一.web的衰落 完全结构化的文本太过古板,太平常,虽然有N个理由要求使用结构化标记,但HTML已然走到了今天. ...

  5. mysql两种备份方法总结:mysqldump 和 xtrabackup

    mysqldump工具基本使用 1. mysqldump [OPTIONS] database [tables…] 还原时库必须存在,不存在需要手动创建     --all-databases: 备份 ...

  6. 个人作业 项目alpha版本测试

    课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业要求:https://edu.cnblogs.com/campus ...

  7. Listview四种视图VIEW

    http://wenku.baidu.com/link?url=65Ac8WL6j8KZwDlN8LyoxqFF5Jynvg80LnKc4jqTPQTY-59wwRDKhqGySYwxf6gZ9_6T ...

  8. (最新)2019年ICPC东亚地区-区域赛赛站网络赛以及现场赛时间安排

  9. JVM 程序计数器

    程序计数器是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转 ...

  10. SpringBoot之初体验

    一.SpringBoot 介绍 1.1 SpringBoot 使命 在之前我们学习 Spring 时,我们了解到 Spring 最根本的使命就是 简化Java开发.而 SpringBoot 的出现也有 ...