一、首先说一句什么是接口:接口简单来讲就是服务器端用来返回给其余程序或者客户端数据的桥梁php
二、接口的做用:根据固定参数返回固定数据,好比客户端传a=1,那么服务器端返回a的姓名,客户端传a=2,服务器端返回a的性别,而不会返回其余数据。java
三、signature签名的做用:保证接口与数据的安全数据库
四、token的做用:和PC登录的session同样,做为用户进入的惟一票据json
例如:app与服务器端的接口、java与php之间不一样程序的接口,这些接口通常经过json格式传输数据安全
因此为了保证移动端和服务端数据传输相对安全,须要对接口进行加密传输服务器
一、token的设计目的: 微信
由于APP端没有和PC端同样的session机制,因此没法判断用户是否登录,以及没法保持用户状态,因此就须要一种机制来实现session,这就是token的做用,token是用户登录的惟一票据,只要APP传来的token和服务器端一致,就能证实你已经登录(就和你去看电影同样,须要买票,拿着票就能进了)session
二、token设计时的种类: app
(1)第三方登录型:这种token形如微信的access_token,设计原理是按照OAuth2.0来的,其特色是定时刷新(好比两小时刷新),目的是由于数据源将登录权限赋予第三方服务器时必需要控制其有效期和权限,要否则第三方服务器能够不通过用户赞成,无限期从数据源服务器获取用户任意数据框架
(2)APP自用登录型:这种token就是通常的APP用的token,由于不通过第三方,而是用户直接取数据源服务器数据,因此设计比较随意,只须要保证其token的惟一性就行
三、APP自用登录型token实现步骤:
(1)数据库用户表添加token字段和time_out这个token过时时间字段
(2)用户登录时(注册时自动登录也须要)生成一个token和过时时间存入表中
(3)在其余接口调用前,判断token是否正确,正确则继续,错误则让用户从新登录
四、APP自用登录型token实现代码(公司自用框架及逻辑,主要看逻辑,不要直接复制代码):
(1)//下面是用户登录时把token插入数据库的代码
$logininfo['token'] = appuser::settoken();
$time_out = strtotime("+7 days");
db::setByPk('u_adver', array('token1' => $logininfo['token'], 'time_out' => $time_out), $logininfo['id']);
(2)//下面是生成token方法代码
public static function settoken()
{
$str = md5(uniqid(md5(microtime(true)),true)); //生成一个不会重复的字符串
$str = sha1($str); //加密
return $str;
}
(3)//下面是每一个接口都必须调用的token验证代码,验证具体实现是在(4)
$args['token'] = $_POST['token'];
$tokencheck = appuser::checktokens($args['token'], 'u_adver');
if ($tokencheck != 90001)
{
$res['msg_code'] = $tokencheck;
v_json($res);
}
(4)//token验证方法,db::是数据库操做类,这里设置是token若是七天没被调用则须要从新登录(也就是说用户7天没有操做APP则须要从新登录),若是某个接口被调用,则会从新刷新过时时间
public static function checktokens($token, $table)
{
$res = db::getOneForFields($table, 'time_out', 'token1 = ?', array($token));
if (!empty($res))
{
if (time() - $res['time_out'] > 0)
{
return 90003; //token长时间未使用而过时,需从新登录
}
$new_time_out = time() + 604800;//604800是七天
if (db::setWhere($table, array('time_out' => $new_time_out), 'token1 = ?', array($token)))
{
return 90001; //token验证成功,time_out刷新成功,能够获取接口信息
}
}
return 90002; //token错误验证失败
}