登陆失效的实现

今天做《舆图》的 API 时突然想到一个问题:比如说一个用户在 iPad A 上登录了自己的账号,然后又在 iPad B 上登录了自己的账号,这时候 A 上的账号是不是应该被 T 下来?

还有,如果一位用户的账号被盗了,这时用户改了密码,原来的登陆也应该失效才是。

想了一下,还是得用缓存来存储 session,然后客户端调用 API 的时候进行验证。

memcached 实现了,以后如果有需求可以换成 Redis。感觉自己写 API 各种造轮子,虽然不难,但因为以前没有用过,在这里记录一下。

由于我负责 API 部分,这里贴一下服务端是怎么写的,由于客户端与服务器交互本身经过加密,所以其实不用担心伪造 session 的问题,但出于习惯还是在生成算法里加了 TOKEN

config.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$memcache = new Memcache;
$memcache -> connect('localhost', 11211);
if(isset($_POST['uid']) && isInteger($_POST['uid'])){
if(isset($_POST['session']) && !empty($_POST['session'])){
$uid = $_POST['uid'];
$c_session = $_POST['session'];
$session = $memcache -> get($uid);
if($session === false){
// Session doesn't exist in memory,
// may be wiped out due to memory limit.
// Using the post data instead.
$memcache -> add($uid, $c_session, 0, 0);
}else if($c_session !== $session){
// session mismatched, re-login required.
error('7');
}
}else{
//parameter missing
error('2');
}
}

然后在 login.php 中判断密码正确后生成 session,保存在 memcached 即可

login.php
1
2
3
4
5
6
7
require("config.php");
// Irrelevant code was omitted.
// You can make your own algorithm to generate the session,
// I use TOKEN here to ensure safety.
$session = md5($uid.time().TOKEN);
// write the session to memcache
$memcache -> set($uid, $session);

需要登陆失效的时候,只需重新生成此用户的 session 即可。