zoukankan      html  css  js  c++  java
  • JWT之登录、登出、验证码接口

    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 appadminapicontroller;
    
    use thinkController;
    
    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 = appcommonmodelAdmin::where($where)->find();
            if(!$info){
                //用户名或者密码错误
                $this->fail('用户名或者密码错误');
            }
            $data['token'] = 	oolsjwtToken::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 = 	oolsjwtToken::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);
     }
  • 相关阅读:
    MySQL Backup mysqldump 常用选项与主要用法--转发
    openssl 之RSA加密
    Windows 之Dll/lib导出
    缓存雪崩、击穿、穿透
    时间复杂度
    分布式事务
    mysql主从复制与读写分离
    什么是消息队列?
    微服务架构演化
    高并发问题常规思路
  • 原文地址:https://www.cnblogs.com/ruoruchujian/p/11271534.html
Copyright © 2011-2022 走看看