6.2 验证码接口
验证码接口用于登录页面展示时,获取验证码图片地址及验证码标识
安装验证码功能组件(如果是官网下载的完整版框架,无需安装)
composer require topthink/think-captcha 1.*
设置路由,application/route.php中,adminapi域名路由部分,增加代码如下
//验证码图片
Route::get('captcha/:id', "\\think\\captcha\\CaptchaController@index");//访问图片需要
Route::get('captcha', 'adminapi/login/captcha');
在login控制器中添加
<?php
namespace app\adminapi\controller;
use think\Controller;
class Login extends BaseApi
{
/**
* 获取验证码图片地址
*/
public function captcha()
{
//验证码标识
$uniqid = uniqid(mt_rand(100000, 999999));
//返回数据 验证码图片路径、验证码标识
$data = [
'src' => captcha_src($uniqid),
'uniqid' => $uniqid
];
$this->ok($data);
}
}
测试:浏览器或者postman 访问 http://adminapi.pyg.com/captcha
{
"code":200,
"msg":"success",
"data":{
"src":"http:\/\/adminapi.pyg.com\/captcha\/7873845d27250ede217.html",
"uniqid":"7873845d27250ede217"
}
}
可根据实际需要,对验证码进行自定义配置: application/config.php
验证码组件,默认将验证码中的字符,存放在session中。
考虑到部分客户端(比如手机app) ,一般不使用session(显示验证码的请求和登录的请求,其session会话彼此独立)。
可修改组件源代码如下:
vendor/topthink/think-captcha/src/Captcha.php 的entry方法中
后续验证时,先从缓存取出对应的session_id, 并设置session_id。 见登录接口。
登录接口
①创建管理员模型(注意 管理员表为 pyg_admin 对应模型名称 为 Admin)
②设置路由,application/route.php中,adminapi域名路由部分,增加代码如下
//登录
Route::post('login', 'adminapi/login/login');
③封装密码加密函数
注意:后台管理员表tpshop_admin中 初始的管理员密码,需要自己加密一个初始密码,更新到数据表
使用自定义的密码加密函数:
④登录功能
/**
* 登录接口
*/
public function login()
{
//获取输入变量
$param = input();
$validate = $this->validate($param, [
'username' => 'require',
'password' => 'require',
'code' => 'require',
'uniqid' => 'require'
]);
if($validate !== true){
$this->fail($validate);
}
//根据验证码标识,从缓存取出session_id 并重新设置session_id
session_id(cache('session_id_'.$param['uniqid']));
//进行验证码校验 使用手动验证方法
if (!captcha_check($param['code'], $param['uniqid'])) {
//验证码错误
$this->fail('验证码错误');
}
//根据用户名和密码(加密后的密码),查询管理员用户表
$where = [
'username' => $param['username'],
'password' => encrypt_password($param['password'])
];
$info = \app\common\model\Admin::where($where)->find();
if(!$info){
//用户名或者密码错误
$this->fail('用户名或者密码错误');
}
$data['token'] = \tools\jwt\Token::getToken($info->id);
$data['user_id'] = $info->id;
$data['username'] = $info->username;
$data['nickname'] = $info->nickname;
$data['email'] = $info->email;
//登录成功
$this->ok($data);
}
退出接口
/**
* 后台退出接口
*/
public function logout()
{
//清空token 将需清空的token存入缓存,再次使用时,会读取缓存进行判断
$token = \Token::getRequestToken();
$delete_token = cache('delete_token') ?: [];
$delete_token[] = $token;
cache('delete_token', $delete_token, 86400);
$this->ok();
}
登录检测
除了登录相关接口,其他接口都需要登录后才能访问。
在application/adminapi/controller/BaseApi.php中进行检测。
①设置无需检测方法列表
//无需进行登录检测的请求
protected $no_login = ['login/login', 'login/captcha'];
②进行检测
try{
$path = strtolower($this->request->controller()) . '/' . $this->request->action();
if(!in_array($path, $this->no_login)){
$user_id = \tools\jwt\Token::getUserId();
//登录验证
if(empty($user_id)){
$this->fail('未登录或Token无效', 403);
}
//将获取的用户id 设置到请求信息中
$this->request->get(['user_id' => $user_id]);
$this->request->post(['user_id' => $user_id]);
}
}catch(\Exception $e){
$this->fail('服务异常,请检查token令牌', 403);
}