登陆失效的实现

今天做《舆图》的 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 即可。

升级了一下博客

把 Hexo 从 2.5.6 升级到了 3.0.1,版本跨度比较大,原来的主题已经不再适用了,用默认主题改了下,最近就是喜欢这种彩虹色风格 = =。

貌似 GitCafe 采用了某种 CDN ,每次更新要很久才会显示出来。

这里真心要吐槽一下 Stylus ,分成很多文件一个个找得人蛋疼。

先挂几天看看会不会有问题。

《舆图》API文档

给朋友的一个创业项目做API。

挺久没写PHP了,又重新捡起来。

似乎API没有想象的那么简单,要考虑版本维护、安全认证等等方面,还好之前用过不少API【雾】,模仿着做了个大概。

现在才做了一个功能,之后再慢慢加吧。

最近手里项目比较多,心烦意乱,在 GitCafe、SAE 和自己的服务器间切换来切换去,决心精简空间数目。想了想还是把静态的东西都放到 GitCafe 上好了。

所以就把文档放这里了:舆图文档

看着博客的界面已经用了好久了,已经不符合我现在的审美了,过阵子准备升级一下,换个风格。