我的設(shè)計是:uniapp連接GatewayWorker時,GatewayWorker返回驗證信息【auth、client_id、timestamp】,設(shè)置未綁定超時關(guān)閉;
uniapp請求頭攜帶token,數(shù)據(jù)報文為上一步的驗證信息,請求thinkPHP業(yè)務(wù)系統(tǒng);
thinkPHP業(yè)務(wù)系統(tǒng),在鑒權(quán)成功后,通過GatewayClient綁定用戶id、加入分組、關(guān)閉連接等等操作。
auth的意義其實是簽名,表示在時間戳timestamp,有client_id進行連接;
相當于Session的概念。
thinkphp業(yè)務(wù)系統(tǒng),在做綁定uid或者加入分組時,一定要驗證這個auth值。
/**
* 將client_id與uid綁定
* @param string $client_id
* @param string $uid
* @param string $auth
* @return void
* @throws Exception
*/
public static function bindUid(string $client_id, string $uid, string $auth): bool
{
if (empty($auth) || strlen($auth) < 32) {
throw new Exception('auth驗證參數(shù)為空');
}
$session = Gateway::getSession($client_id);
$_auth = $session['auth'] ?? $session['uniqid'] ?? '';
if (empty($_auth)) {
throw new Exception('session驗證參數(shù)為空');
}
if (hash_equals($auth, $_auth)) {
Gateway::bindUid($client_id, $uid);
return true;
}
return false;
}
業(yè)務(wù)系統(tǒng),鑒權(quán)通過后綁定uid時,一定要驗證接口收到的auth和GatewayWorker系統(tǒng)內(nèi)Session是否相同。