准备好协议(HTTP)、数据表示方法(JSON)、请求数据的方法(REST)

选择一个合适的框架

接口特点汇总:

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的状态,表设计如下:

字段名 字段类型 注释
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' => []
}

青砖黛瓦 故景如旧 草木无情 不解凡忧

APP开发 Token生成 验证的更多相关文章

  1. Python itsdangerous 生成token和验证token

    代码如下 class AuthToken(object): # 用于处理token信息流程: # 1.更加给定的用户信息生成token # 2.保存生成的token,以便于后面验证 # 3.对用户请求 ...

  2. java微信公众号开发token验证失败的问题及解决办法

    本文引自http://m.blog.csdn.net/qq_32331997/article/details/72885424 微信公众平台服务器配置时,需要引入token,但是提交的时候总是提示to ...

  3. HTML5手机APP开发入(5)

    HTML5手机APP开发入(5) 回顾一下 HTML5手机APP开发入(4) 如何自定义Component,directive HTML5手机APP开发入(3) 如何实现MVC的代码重构,自定义一个P ...

  4. SharePoint 2013 APP 开发示例 (三)使用远程的web资源

    在这个示例里我们将详细介绍 TokenHelper 类, 我们将看到它是怎么简单地从远程web站点访问SharePoint的.我们还将取到它的一些值.这将帮助我们理解连接是怎么被构造的,同时也方便我们 ...

  5. 带你从零学ReactNative开发跨平台App开发(七)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  6. app开发中如何利用sessionId来实现服务端与客户端保持回话

    app开发中如何利用sessionId来实现服务端与客户端保持回话 这个问题太过于常见,也过于简单,以至于大部分开发者根本没有关注过这个问题,我根据和我沟通的开发者中,总结出来常用的方法有以下几种: ...

  7. App开发如何利用Fidder,在api接口还没有实现的情况下模拟数据,继续开发

    相信app开发很多时候,都是等后台出接口,拿到数据调试错误.殊不知,我们完全可以不用等,只要有约定好的接口定义文档,借助工具就能做到,自己模拟数据返回~      下面主要是在项目组开发过程中,使用F ...

  8. SharePoint Server 2013开发之旅(三):为SharePoint Server配置App开发、部署、管理环境

    上一篇我讲解了如何利用微软提供的Office 365开发人员网站,进行在线的SharePoint App开发,这当然是不错的一个选择,因为你可以快速地进行开发和调试.(仅仅针对App开发而言).但是, ...

  9. App开发到App Store上架,发布流程。

     http://blog.csdn.net/wojsg001/article/details/12005887 App开发到App Store上架,发布流程. 分类: IOS2013-09-25 11 ...

随机推荐

  1. api接口类型

    类型一:js+xml 类型二:纯php模式 参考: <?php $ip = '117.25.13.123'; $datatype = 'text'; $url = 'http://api.ip1 ...

  2. 的vim和emacs常用配置记录

    因为经常改变工作环境,所以在这里记录一下我的.vimrc文件和.emacs文件的内容. vimrc的配置文件,主要是设置语法高亮,和tab键的宽度,个人喜欢设置为4个空格的分量. " set ...

  3. Unity3D 动态改变地形

    直接获取TerrainData进行修改即可 using System.Collections; using UnityEngine; using UnityEditor; public class D ...

  4. ORACLE 常见错误

    ora-00904 :   标识符无效:查询语句中的列或表在oracle 中不存在:

  5. PAP认证方式原理和实现

    PAP认证协议 基本描述: Password Authentication Protocol 口令认证协议 PAP认证过程非常简单,二次握手机制,使用明文格式发送用户名和密码,发起方为被认证方,可以做 ...

  6. 使用Navicat Preminum时,发现的几个好用的功能

  7. //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和

    //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和 # include<stdio.h> void main() { ,sum1; ]={,- ...

  8. Collection小结

    Collection:

  9. word20161224

    V.34 V.90 validation / 验证 value entry / 值项 variable / 变量 variable bit rate, VBR / 可变传输率 VBR, variabl ...

  10. 多线程AutoResetEvent

    我们在线程编程的时候往往会涉及到线程的通信,通过信号的接受来进行线程是否阻塞的操作. AutoResetEvent 允许线程通过发信号互相通信.通常,此通信涉及线程需要独占访问的资源. AutoRes ...