移动端与服务端通信流程设计

转自: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‘ => []
}

时间: 2024-10-21 09:07:36

移动端与服务端通信流程设计的相关文章

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

增强地方一: 再增加2张表,一个接口表,一个授权表,设计参考如下: 接口表 字段名 字段类型 注释 api_id int 接口ID api_name varchar(120) 接口名,以"/"作为分割线,如 blog/Index/addBlog api_domain varchar(256) 所属领域 is_enabled tinyint(1) 是否可用  1:可用 0:不可用 add_time int 添加时间(戳) (注:只列出了核心字段,其它的再扩展吧!!!) 授权表 字段名 字

手游、页游和端游服务端的架构与区别

GameRes游资网发布, 文 / 韦易笑 手游页游和端游的服务端本质上没区别,区别的是游戏类型. 类型1:卡牌.跑酷等弱交互服务端 卡牌跑酷类因为交互弱,玩家和玩家之间不需要实时面对面PK,打一下对方的离线数据,计算下排行榜,买卖下道具即可,所以实现往往使用简单的 HTTP服务器: 登录时可以使用非对称加密(RSA, DH),服务器根据客户端uid,当前时间戳还有服务端私钥,计算哈希得到的加密 key 并发送给客户端.之后双方都用 HTTP通信,并用那个key进行RC4加密.客户端收到key和

HTTP服务端JSON服务端

HTTP服务端JSON服务端 最后更新日期:  2014-5-18 Author: Kagula 阅读前提: CMake工具的基本使用 内容简介: CPPCMS是个开源Web开发框架,通过它可以很容易实现HTTP服务和JSON服务,这里介绍CPPCMS开发环境的搭建.写一个CPPCMS测试程序,它建立HTTP服务,向浏览器返回Hello,World页面.CPPCMS依赖的一些第三方库,其它地方已经介绍怎么Build,所以这里不重复了. 环境:Windows8.1 64bit.Visual Stu

恩布企业IM PC端,服务端公布 1.16 版本号

恩布企业IM PC端,服务端公布1.16版本号,开源企业IM.免费企业即时通讯软件:主要版本号更新内容: 恩布服务端核心程序,添加进程守护保护机制,确保系统7*24持续稳定服务: 服务端添加内存数据库同步机制.降低直接操作数据库.提高系统性能. PCclient优化界面和操作体验,如添加联系人移到其它分组,完好在线人数显示等: 完好数据回调同步机制,实现注冊用户,改动password和用户上下线数据同步,支持HTTPS连接和数据加密: 添加部分REST API接口.解决已知BUG,提高系统性能:

恩布企业IM PC端,服务端发布 1.16 版本

恩布企业IM PC端,服务端发布1.16版本,开源企业IM,免费企业即时通讯软件:主要版本更新内容: 恩布服务端核心程序,增加进程守护保护机制,确保系统7*24持续稳定服务: 服务端增加内存数据库同步机制,减少直接操作数据库,提高系统性能: PC客户端优化界面和操作体验,如增加联系人移到其他分组,完善在线人数显示等: 完善数据回调同步机制,实现注册用户,修改密码和用户上下线数据同步,支持HTTPS连接和数据加密: 增加部分REST API接口:解决已知BUG,提高系统性能: 最新1.16版本百度

电脑监控软件实现(截图端、服务端、监控端)

最近在做的项目中客户有监控软件的需求. 需求:每5秒显示被监控电脑的桌面情况. 实现思路: 1.截图端:Timer每5秒截图.调用服务端接口上传. 2.服务端:保存截图到服务端本地并把截图信息保存到数据库,包括图片在服务端的保存路径. 3.监控端:①调用服务端下载List<ScreenShot>接口,下载需要显示的截图列表.②Timer每5秒调用服务端下载最新ScreenShot对象,加入监控端list<ScreenShot>中.③要显示某张截图时根据本地List<Scree

恩布企业IM PC端,服务端发布 1.17 版本

恩布企业IM PC端,服务端发布1.17版本,开源企业IM,免费企业即时通讯软件:主要版本更新内容: 增加内置数据库(SQLite),方便普通企业安装部署: 增加邮件发送功能,支持实现新用户帐号激活,密码重置等功能: PC客户端增加应用工作区,方便企业集成第三方网页应用: 解决P2P文件传输异常,部分Windows系统需要安装微软运行库才能正常运行问题: 优化完善界面操作体验和功能:增加部分REST API接口:修正已知BUG,提高系统性能: 最新1.17版本百度云盘下载地址: http://p

客服端与服务端APP支付宝支付接口联调的那些坑

根据支付宝官方提供的文档的建议: TIPS:这一步应在商户服务端完成,商户服务端直接将组装和签名后的请求串orderString传给客户端,客户端直接传给SDK发起请求.文档和Demo是为了示例效果在客户端实现. 商品的订单信息和签名应该放在服务端进行,将最好生成的orderString发送给客户端,客户端直接换起支付,处理好回调就ok.思路很简单,但实现却要下番功夫. 坑一: 如果以PHP为服务后台为例,官网是没有提供集成好的PHP运行DEMO,我们的处理方式是参展APPDemo里的思路,和官

mariadb常用的客服端及其服务端命令

一.安装MariaDB及其配置步骤   1)创建存放数据目录及其用户 mkdir -pv /mydata/data groupadd -r mysql useradd -g mysql -r mysql 2)授权数据存放目录 chown -R /mydata/data 3)解压mariadb-5.5.48-linux-x86_64.tar.gz tar xfmariadb-5.5.48-linux-x86_64.tar.gz -C /usr/loca/mysql 4)为数据库提供配置文件及其启动