当我们在写接口的时候,一定会碰到接口安全相关。一般会有两种情况。
- 不需要用户参与,比如客户端读取新闻列表、用户列表。
- 需要用户参与,比如修改用户的信息,评论新闻的内容等。
针对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的设计,最好是在用户登录之后,登录时,可以获取到的信息有。
- 用户名
- 明文密码
客户端将用户名和密码进行传输,并保存用户名到本地.
服务端获取参数后,生成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可以永久使用。