thinkphp6.1实现前后端分离的图片验证码,就是这么简单~
thinkphp6.1提供的验证码插件是基于session,对于前后端分离的项目,并不能直接使用,但是我们可以间接使用它,而不用重新写一个插件。
分享一下基于thinkphp6.1实现的商城管理系统教程
教程:https://gitee.com/myha/demo-shop
https://blog.csdn.net/gzmyh/article/details/130827037?spm=1001.2014.3001.5501
首先我们安装一下官网提供的验证码插件
composer require topthink/think-captcha
输出验证码
接下里看看控制器写的获取验证码的代码
//图片验证码
public function verify(){$uniqid = uniqid(rand(00000,99999));$rs = Captcha::create();$base64_image = "data:image/png;base64," . base64_encode($rs->getData());$key = session('captcha.key');cache(ADMIN_LOGIN_VERIFY_.$uniqid,$key);return $this->success(['uniqid'=>$uniqid,'image'=>$base64_image]);
}
正常情况下,你只需这样return Captcha::create(),就能在网页上看到验证码,但前面说了,这是前后端分离的项目,因此返回给前端需要两个东西:用于设置缓存的唯一标识和base64加密的图片。
接下来解释一下代码,为什么是这么写的
我看了一下源码,打开Captcha.php发现Captcha::create()返回的是一个Response对象
public function create(string $config = null, bool $api = false): Response
Response里面有个getData()就是获取内容的方法,因此base64_encode($rs->getData())就是获取验证码图片
另外我们从源码中的generate(),这个是生成验证码的方法,其中有这样的代码
//$key这里的$key是验证码字符
$hash = password_hash($key, PASSWORD_BCRYPT, ['cost' => 10]);
$this->session->set('captcha', ['key' => $hash,
]);
把验证码字符进行加密,存储到session,因此这里使用session('captcha.key')获取到这个key值,然后我们把它存储到缓存中,而这个key是使用uniqid()方法生成的唯一标识
验证输入的验证码是否正确
还是先看看验证的代码
$data = $this->request->post();
$key = cache(ADMIN_LOGIN_VERIFY_.$data['uniqid']);
if($key && password_verify(mb_strtolower($data['code'], 'UTF-8'), $key)){cache(ADMIN_LOGIN_VERIFY_.$uniqid,null);
}else{return $this->failure(config('error.er17')['code'],config('error.er17')['msg']);
}
首先前端需要提交uniqid和code这两个字段过来,第一步判断cache(ADMIN_LOGIN_VERIFY_.$data['uniqid'])是否存在,如果存在,就判断输入进来的验证码是否正确,这里用到password_verify(),很多人可能有疑问,为什么这么写?
答案还是在源码里面,还是打开Captcha.php,其中有个验证验证码是否正确的方法
/*** 验证验证码是否正确* @access public* @param string $code 用户验证码* @return bool 用户验证码是否正确
*/
public function check(string $code): bool
{if (!$this->session->has('captcha')) {return false;}//就是这三行代码$key = $this->session->get('captcha.key');$code = mb_strtolower($code, 'UTF-8');$res = password_verify($code, $key);if ($res) {$this->session->delete('captcha');}return $res;
}
//源码
$key = $this->session->get('captcha.key');//我们的代码
$key = cache(ADMIN_LOGIN_VERIFY_.$data['uniqid']);//源码
$code = mb_strtolower($code, 'UTF-8');
$res = password_verify($code, $key);//我们的代码
password_verify(mb_strtolower($data['code'], 'UTF-8'), $key)
其实就是照搬过来,一个前后端分离的验证码就这么简单的实现了~
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
