Menu Close

app开发之鉴权 PHP版

当我们在写接口的时候,一定会碰到接口安全相关。一般会有两种情况。

  1. 不需要用户参与,比如客户端读取新闻列表、用户列表。
  2. 需要用户参与,比如修改用户的信息,评论新闻的内容等。

针对1的设计,可以在公共参数上下功夫,比如一般框架的请求都会有“controller”"action",
然后客户端和服务端再定义一个加密字符串,比如"!@#$%",然后进行字符串排序拼接,然后hash。(比如md5),客户端在发送请求的时候带上加密后的字符串。

$token =  md5($controller_name.$action_name."!@#$%"),

服务端收到请求后,获取当前的controller_name,和action_name和传过来的token,然后依照客户端加密方式,重新md5,然后进行对比.


$controller_name = "user";
$action_name  = "view";
$secure = "!@#$%";
$token = md5($controller_name.$action_name.$secure);
if($token != $_GET['token']){
    exit("鉴权失败");
}
#做一些事情

针对2的设计,最好是在用户登录之后,登录时,可以获取到的信息有。

  1. 用户名
  2. 明文密码

客户端将用户名和密码进行传输,并保存用户名到本地.

服务端获取参数后,生成token,例:

$user_name = "jack";
$user = $this->getUserInfo($user_name);  //应该会返回一个用户信息。
$md5_password = $user['md5_password'];//这里可能只是简单md5一下密码,也可能加盐($salt);
$secure_str = '!@#$%'; //固定,客户端和服务端约定的一个密码串
$token = md5($md5_password . $secure_str);

然后将token返回给客户端.
以后客户端传输数据时,只需要带上token和用户名即可.可以放在http的head头里。
每次传输给服务端,服务端都会去进行验证

$user_name = $this->getParams['username']; //获取客户端提交的用户名
$token     = $this->getParams['token'] ; //获取客户端提交的token
$user = $this->getUserInfo($user_name);  //应该会返回一个用户信息。
$md5_password = $user['md5_password'];//这里可能只是简单md5一下密码,也可能加盐($salt);
$secure_str = '!@#$%'; //固定,客户端和服务端约定的一个密码串
if(md5($md5_password . $secure_str) != $token)
{
    //则不匹配
}

其他的安全方式,比如网站使用HTTPS,防止中间人获取。定时刷新token,防止一个token可以永久使用。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注