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 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);
 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM