今天在做項目的時候有一個問題就是Session在開發API的情況下官方是不推薦用的,那么問題來了,用戶信息怎么保存呢?下面來記錄一下我的寫法。
首先我用的是JWT插件對token進行生成及驗證,話不多說,擼起袖子搞起來。
首先寫登錄文件,我的文件創建在app/controller/admin/Login.php,創建完成之后在里面我寫了一個login方法,內容如下:
public function login(Request $request): Response
{
//用$data接收前端發送過來的數據
$data = $request->param();
//這里我用的是驗證器來驗證管理員賬號密碼是否正確
$result = Validate::rule([
'username' => 'unique:system_user,username^password'
])->check([
'username' => $data['username'],
'password' => sha1($data['password'])
]);
//判斷賬號密碼是否正確
if(!$result){
//賬號密碼正確的話,獲取賬號信息
$userInfo = SystemUser::where('username',$data['username'])->field('id,username,nickname')->find();
//將獲取到的賬號信息進行生成Token數據并保存
$token = signToken($userInfo);
//寫入日志
$data['userId'] = $userInfo['id'];
$data['nickname'] = $userInfo['nickname'];
這里是寫入日志的方法,自行創建就行
$this->log($data,true);
return create(['access_token' => $token],'登錄成功');
}else{
//寫入日志
$this->log($data,false);
return create([],'賬號或密碼錯誤,請重新輸入',400);
}
}
接下來Token的生成與驗證了,我給他寫在了公共文件里,需要注意的是我們要先安裝JWT插件
安裝JWT的方法:
```
composer require firebase/php-jwt
```
安裝完成之后我們需要引入JWT插件
```
use Firebase\JWT\JWT;
use Firebase\JWT\SignatureInvalidException;
use Firebase\JWT\BeforeValidException;
use Firebase\JWT\ExpiredException;
```
下面就是我在公共方法寫的生成與驗證的方法
```
//這里是生成Token的方法,我們接收傳來的用戶信息
function signToken($userInfo): string
{
$key = '!@#$%*&'; //這里是自定義的一個隨機字串,應該寫在config文件中的,解密時也會用,相當 于加密中常用的 鹽 salt
$token = array(
"iss"=>$key, //簽發者 可以為空
"aud"=>'', //面象的用戶,可以為空
"iat"=>time(), //簽發時間
"nbf"=>time()+3, //在什么時候jwt開始生效 (這里表示生成100秒后才生效)
"exp"=> time()+14400, //token 過期時間
"data"=>[ //記錄的userid的信息,這里是自已添加上去的,如果有其它信息,可以再添加數組的鍵值對
//token攜帶的信息,從方法傳進來的,如需擴展自定義添加
'userId'=>$userInfo['id'], //用戶ID
'username'=>$userInfo['username'] //登錄賬號
]
);
return JWT::encode($token, $key, "HS256"); //根據參數生成了 token
}
//這里是驗證Token的方法
function checkToken($token): array
{
$key = '!@#$%*&';
$status = array("code" => 2);
try {
JWT::$leeway = 60;//當前時間減去60,把時間留點余地
$decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,這里要和簽發的時候對應
$arr = (array)$decoded;
$res['code'] = 1;
$res['data'] = $arr['data'];
return $res;
} catch(SignatureInvalidException $e) { //簽名不正確
$status['msg'] = "簽名不正確";
return $status;
}catch(BeforeValidException $e) { // 簽名在某個時間點之后才能用
$status['msg'] = "token失效";
return $status;
}catch(ExpiredException $e) { // token過期
$status['msg'] = "token過期";
return $status;
}catch(Exception $e) { //其他錯誤
$status['msg'] = $e;
return $status;
}
}
```
好了,登錄與Token的東西都已經搞定了,接下來我們就是要在TP6里面存儲我們的用戶信息,擼起袖子看代碼
第一步,創建登錄驗證的中間件:app/middleware/LoginCheck.php,代碼如下:
```
<?php
declare (strict_types = 1);
namespace app\middleware;
use app\BaseController;
use think\Request;
use think\Response;
class LoginCheck extends BaseController
{
/**
* 處理請求
*
* @param Request $request
* @param Closure $next
* @return Response
*/
public function handle(Request $request, \Closure $next): Response
{
//獲取訪問用戶的token,我這里用的是authorization字段,大家根據自己的項目實況
$token = $request->header('authorization');
//因為前后端分離規范的問題,加上JWT校驗的格式,提交來的Token前面攜帶的Bearer我給干掉
$token = str_replace('Bearer ','',$token);
//干掉之后就可以丟給JWT去驗證這個Token是否有效了
$result = checkToken($token);
//驗證token是否正確
if($result['code'] !== 1){
return create([],'請登錄后在進行操作',401);
}else{
//驗證完成之后我們給返回的用戶信息寫入到request里面
$request->userInfo = $result['data'];
return $next($request);
}
}
}
```
第二步,創建控制器的基類:app/controller/AuthBase.php,里面的代碼寫法:
```
<?php
namespace app\controller;
use app\BaseController;
use think\App;
use think\facade\Request;
class AuthBase extends BaseController
{
//在基類設置并調用中間件
protected $middleware = [
'LoginCheck'
];
public function __construct(App $app)
{
parent::__construct($app);
}
}
```
好了,到此所有的代碼都擼完了,接下來我們在其他方法如果想調用當前登錄的用戶信息,只需要調用:
```
//調用方法
request()->userInfo;
//返回的對象
^ {#83
+"userId": 1
+"username": "admin"
}
```
好了,基本功能就是這么實現的,自己記錄一下,也順便分享給大家做參考,如果有更好的方法,大佬們也可以分享一下。
- 空白目錄
- thinkcmf的權限管理
- thinkcmf+unicmf添加頁面
- Thinkphp5做后臺 Uni-app做前臺解決跨域問題
- 組件
- h5跨域-uniapp
- thinkphp5 auth 教程
- thinkphp5Auth類
- uniapp添加與編輯的差別
- 常見的請求方式
- uni 單選回顯數據_uniapp 頁面跳轉傳值和接收
- uni-app 單選/多選/滑動 demo
- 關于uniapp checkbox多選框如何傳值傳數據
- uniApp 多選框checkbox ,判斷是否選中
- uniapp添加復選框和獲取復選框的值
- uni-app中全選多選單選
- uniapp多選框CheckBox 數據接收
- uniapp下拉列表單選框復選框實戰demo(編輯或詳情頁)
- uni-data-CheckBox-OK
- js 字符串數組轉換成數字數組
- js把字符串轉為數組對象
- js中數組對象字符串的相互轉換
- JS怎么把字符串數組轉換成整型數組
- 小程序開發
- tp5.1跨域請求
- uniapp-h5跨域
- 新增
- order
- uni-app中調取接口的三種方式與封裝uni.request()
- uView-checkbox
- 給u-view的u-select賦值
- uView-下拉框、復選框、單選框 數據發送及接收
- CURD操作
- thinkphp5.1增刪改查
- TP5.1添加數據成功之后返回自增主鍵id
- Thinkphp實戰之Request默認值except only 以及過濾參
- uni-app跨域解決方案
- thinkphp5.1+uni-app接口開發中跨域問題解決方案
- tp6 + uniapp 前后端跨域解決方案
- uniapp-token相關
- uniapp request請求封裝包含token兼容多端,簡單易用
- CORS.php
- ThinkPHP6 API開發前后端分離用戶信息保存在后端的方法
- thinkphp的jwt(JSON Web Token)身份驗證
- thinkphp6增刪改查
- PHP模擬GET,POST請求
- php模擬get、post發送請求的6種方法
- thinkphp6
- uniapp封裝網絡請求
- thinkphp6搭建后端api接口jwt-auth
- uniapp實現APP微信登錄流程
- [uni-app] 中保持用戶登錄狀態
- 詳解vue中localStorage的使用方法
- vue 實現通過vuex 存儲值 在不同界面使用
- dispatch:異步操作,數據提交至 actions ,可用于向后臺提交數據
- ThinkPHP6.0 + Vue + ElementUI + axios 的環境安裝到實現 CURD 操作
- tp6錯誤集
- TP6 模型插入/添加數據,自動插入時間(自動時間戳)
- 手機不開機維修思路
- thinkphp6解決vue跨域問題
- 從0基礎獲取短視頻去水印解析接口制作
- thinkphp5 刪除緩存
- thinkPHP,怎么把json文件里面的數據導入數據庫
- 數字轉字符php
- php – 直接用curl下載遠程文件
- thinkphp – 直接用curl下載遠程文件
- apiAdmin安裝
- echart
- thinkphp開發小程序推廣分享帶參數二維碼生成
- php同比增加函數
- PHP獲取同比上周、上一個月,上一個季度,去年時間區間
- “前3秒”金句100例,趕緊收藏起來!
- PHP配合微信公眾號生成推廣二維碼
- thinkphp5+php微信公眾號二維碼掃碼關注推廣二維碼事件實現
- 獲取當前時間上一周的開始時間和結束時間
- TP6 查找指定工作日
- PHP 獲取當天、近一周、本周、上月、本月、本季度、上季度時間方法大全
- php獲取今日、昨日、本周、本月 日期方法
- Tp5+mysql按年季度月周日小時查詢時無數據的時間段補0方法
- mysql按天統計的時候,該天沒有數據也要統計為0
- 列出一星期的日期 無數據補0
- thinkphp6本周 上周 周一 周末日期
- 補全日期 無數據補0
- php+pv統計代碼實現,Laravel 10 行代碼實現簡單的網站 pv uv 統計
- 通過API獲取ip地址以及城市和運營商
- 獲取訪客信息
- 13行代碼實現微信小程序設置概率觸發激勵視頻閱讀文章
- uniapp 微信小程序 獲取場景值和場景值個性化參數
- 微信小程序分享小程序碼的生成(帶參數)以及參數的獲取
- 小程序推廣分享帶參數二維碼生成
- uniapp微信小程序生成對應頁面二維碼
- uniapp獲取當前頁面url
- uniapp微信小程序--微信登錄
- 微信小程序,生成小程序碼中scene參數的存放和獲取問題
- uni-app 微信小程序生成二維碼帶參數
- uni-app 微信小程序如何把圖片保存到本地相冊?
- thinkPHP5使用assign()傳遞富文本,前端解析成HTML標簽
- tp6解析編輯器里面的html標簽原樣輸出
- PHP判斷url鏈接是否被百度收錄
- 微擎安裝模塊時提示 Failed to connect to we7.rewlkj.com port 80: Timed out
- 小程序碼生成
- thinkphp開發小程序推廣分享帶參數二維碼生成0
- tp3.2偽靜態
- apiadmin安裝教程-2022.8更新
- autojs事件代碼
- uuuu
- thinkphp6: API 多版本控制