驗證碼接口用於登陸頁面展現時,獲取驗證碼圖片地址及驗證碼標識php
安裝驗證碼功能組件(若是是官網下載的完整版框架,無需安裝)html
composer require topthink/think-captcha 1.*
設置路由,application/route.php中,adminapi域名路由部分,增長代碼以下api
//驗證碼圖片 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.phpsession
驗證碼組件,默認將驗證碼中的字符,存放在session中。app
考慮到部分客戶端(好比手機app) ,通常不使用session(顯示驗證碼的請求和登陸的請求,其session會話彼此獨立)。composer
可修改組件源代碼以下:框架
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); }