用Redis存储用户邮箱,实现安全激活(redis邮箱激活)
## Redis安全激活码
在网络认证中,安全激活码是一种特殊的登录验证方式,用户需要先填写自己的邮箱地址,然后系统会发送一封邮件,里面包含一串激活码。用户只有提交正确的激活码,才能完成激活。
在用户激活之前,我们需要把用户提交的邮箱地址存储起来,常见的存储方式是使用关系型数据库,但是大多数关系型数据库(比如MySQL)的存储过程比较繁琐,效率也相对较低。此外,关系型数据库也有一定的漏洞,不安全。
为了优化存储用户邮箱地址的安全性和效率,我们可以使用Redis存储用户的邮箱地址,Undertow框架的Redis服务器提供了一个非常简洁的API来实现这一功能。
### Redis服务搭建
我们需要先在服务器上(可以是电脑,云服务器)上搭建有Redis服务器,在CentOS 8上安装Redis服务器的过程其实很简单,只需要Playbook/Shell脚本就可以搞定。
接下来,在搭建好Redis服务器后,你就可以通过服务器访问地址和端口号来通过客户端连接服务器,比如redis-cli。
### 使用Redis存储用户邮箱
我们需要使用Redis中的SET命令,将用户填写的邮箱地址作为Key,设置一个随机字符串作为Value,实现存储用户邮箱存取操作,代码如下:
// 连接Redis服务器
$redis = new Redis();$redis->connect('127.0.0.1', 6379);
// 获取用户邮箱$eml = $_POST['eml'];
// 随机生成6位激活码$activeCode = substr(uniqid(),0,6);
// 使用SET命令将用户邮箱作为Key,激活码作为Value存储$redis->set($eml, $activeCode);
### 发送邮件
在Redis服务器存储了用户邮箱和激活码之后,再使用PHP发送邮件,把激活码发送给用户的邮箱,这样用户就可以收到安全的激活码了,代码如下:
// 获取激活码
$activeCode = $redis->get($eml);// 邮箱配置信息
$from = '@.com'; $to = $eml;
$subject = '安全激活码';// 激活地址
$url = 'http://..com/active.php?code='.$activeCode;$body = '请点击链接激活:'.$url;
// 发送邮件$result = ml($to, $subject, $body);
if ($result) { print_r("邮件发送成功!");
} else { print_r("邮件发送失败!")
}
### 验证激活码
接下来,当用户收到邮件并点击激活码时,就可以开始进行激活码的验证了,我们可以使用Redis的Get命令,从Redis服务器中获取到用户之前存储的激活码,然后和用户提交的激活码进行比对,如果两个激活码一致,则认证通过,代码实例如下:
// 获取激活码
$activeCode = $_GET['code'];// 从Redis服务器获取存储的激活码
$savedActiveCode = $redis->get($eml);// 比对激活码
if ($savedActiveCode == $activeCode) { print_r("验证通过!");
} else { print_r("验证失败!");
}
相比传统的用户认证方式,使用Redis存储用户邮箱地址安全激