app开发之鉴权 PHP版

5次阅读
没有评论

共计 1237 个字符,预计需要花费 4 分钟才能阅读完成。

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

  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 可以永久使用。

正文完
 0
admin
版权声明:本站原创文章,由 admin 于2017-08-25发表,共计1237字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码