Heim > Artikel > Backend-Entwicklung > So legen Sie ein Berechtigungstoken in PHP fest
So legen Sie das Token in PHP fest: 1. Definieren Sie den Routing-Pfad, um das Token zu erhalten. 3. Verwenden Sie die UserToken-Klasse, um die gesamte Logik zu verwalten. 5. In der Validator-Klasse und der Ausnahmeklasse werden entsprechende Überprüfungsmethoden und Ausnahmebehandlungsmethoden erstellt.
Empfohlen: „PHP-Video-Tutorial“
PHP_Set Permission Token Token
Die von uns entwickelte Backend-API-Schnittstelle wird eine Berechtigungsanforderung für Besucher haben, z. B. einige, die private Informationen enthalten. Die Schnittstelle erfordert die Besucher können die Schnittstelle anfordern und gleichzeitig einen Token übergeben, der dem Besucher im Voraus ausgestellt wurde.
Das ist wie ein Token, wir „überlassen“ den Besucher nur, wenn er es zeigt.
Das Folgende ist eine Aufzeichnung der Code-Schreibideen für Berechtigungstoken.
Definieren Sie den Routing-Pfad, um das Token zu erhalten, und akzeptieren Sie die Codeparameter (Codequelle: WeChat-Server, das Anmeldesystem basiert auf dem WeChat-System). Erstellen Sie die Token-Basisklasse in dieser Ebene und die UserToken-Klasse
Die UserToken-Klasse verwaltet die gesamte Logik: Token-Generierung und -Rückgabe
Erstellen Sie eine Benutzerklasse in der Modellebene, die für das Lesen und Schreiben von Benutzerdatentabellen verantwortlich ist. für UserToken-Aufrufe in der Service-Schicht
Erstellen Sie in der Validator-Klasse und der Ausnahmeklasse entsprechende Überprüfungsmethoden und Ausnahmebehandlung
Controller->Service-Schicht->Modellschicht gibt den Wert an die Service-Schicht->Service-Schicht zurück Geben Sie den Wert an den Controller weiter, und der gesamte Prozess wird mit dem Token-Token-Schreiben abgeschlossen
2. Spezifische Anweisungen
Route::post( 'api/:version/token/user', 'api/:version.Token/getToken' );
public function getToken($code='') { (new TokenGet())->goCheck($code); // 验证器 $token = (new UserToken($code))->get(); return [ 'token' => $token ]; }
Bevor Sie die Service-Schicht aufrufen, müssen Sie die übergebenen Parameter überprüfen. Definieren Sie daher den Validator TokenGet:
class TokenGet extends BaseValidate { protected $rule = [ 'code' => 'require|isNotEmpty' ]; protected $message = [ 'code' => '需要code才能获得Token!' ]; }
Zurück zum Token-Controller. Nachdem die Überprüfung bestanden wurde, rufen wir die von der Service-Schicht definierte UserToken-Klasse auf:
$token = (new UserToken($code))->get();复制代码
Lassen Sie uns hier die Serviceschicht und die Modellschicht besprechen. Unser allgemeines Verständnis ist, dass die Serviceschicht eine abstrakte Kapselung ist, die auf der Modellschicht basiert.
Die Modellschicht ist nur für den Betrieb der Datenbank und deren Rückgabe an die Serviceschicht verantwortlichDann verarbeitet die Serviceschicht die Geschäftslogik und gibt sie schließlich an die Controllerschicht zurückZurück zum Code-Schreiben der Service-Schicht. Da es verschiedene Arten von Token gibt, erstellen wir zunächst eine Token-Basisklasse, die einige gängige Methoden enthält. Dann erfolgt die Vorbereitung der UserToken-Klasse, die das Token an den Besucher zurückgibt.
Da es auf WeChat basiert, benötigen wir drei Informationen: Code, Appid, Appsecret und weisen dann der UserToken-Klasse über den Konstruktor einen Anfangswert zu:
function __construct($code) { $this->code = $code; $this->wxAppID = config('wx.app_id'); $this->wxAppSecret = config('wx.app_secret'); $this->wxLoginUrl = sprintf( config('wx.login_url'), $this->wxAppID, $this->wxAppSecret, $this->code ); }
Dann fügen Sie diese drei an die Parameterposition der Schnittstelle ein bereitgestellt von WeChat. Der Zweck besteht darin, eine vollständige serverseitige WeChat-URL zu erhalten und die von uns benötigte OpenID anzufordern.
Dann wird hier der Schritt des Sendens einer Netzwerkanfrage übersprungen. Der WeChat-Server gibt ein Objekt zurück, das openid enthält. Nachdem wir festgestellt haben, dass der Wert dieses Objekts in Ordnung ist, beginnen wir mit dem Generieren der Funktion grantToken():
private function grantToken($openidObj) { // 取出openid $openid = $openidObj['openid']; // 通过Model层调用数据库,检查openid是否已经存在 $user = UserModel::getByOpenID($openid); // 如果存在,不处理,反之则新增一条user记录 if ($user) { $uid = $user->id; } else { // 不存在,生成一条数据,具体方法略过 $uid = $this->newUser($openid); } // 生成令牌,写入缓存(具体方法见下面的定义) $cachedValue = $this->prepareCacheValue($openidObj, $uid); $token = $this->saveToCache($cachedValue); // 令牌返回到调用者端 return $token; } private function prepareCacheValue($openidObj, $uid) { $cachedValue = $openidObj; $cachedValue['uid'] = $uid; $cachedValue['scope'] = 16; // 权限值,自己定义 return $cachedValue; } private function saveToCache($cachedValue) { $key = self::generateToken(); // 生成令牌的方法 $value = json_encode($cachedValue); $tokenExpire = config('setting.token_expire'); // 设定的过期时间 $request = cache($key, $value, $tokenExpire); if (!$request) { throw new TokenException([ 'msg' => '服务器缓存异常', 'errorCode' => 10005 ]); } return $key; // 返回令牌:token }
Wie Sie sehen können, ist der Kernprozess:
Holen Sie sich die OpenID.Überprüfen Sie die Datenbank und prüfen Sie, ob die OpenID bereits vorhanden ist.public static function generateToken() { $randomChars = getRandomChars(32); // 32个字符组成一组随机字符串 $timestamp = $_SERVER['REQUEST_TIME_FLOAT']; $salt = config('security.token_salt'); // salt 盐 // 拼接三组字符串,进行MD5加密,然后返回 return md5($randomChars.$timestamp.$salt); } function getRandomChars($length) { $str = null; $strPoll = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $max = strlen($strPoll) - 1; for ($i = 0; $i < $length; $i++) { $str .= $strPoll[rand(0, $max)]; } return $str; }
3. ZusammenfassunggenerateToken()
-Methode im obigen Beispiel gezeigt, handelt es sich um eine Kernmethode, die alle Prozesse umfasst, aber verschiedene spezifische Prozesse werden in anderen Methoden definiert und dann dem generateToken()
-Methodenaufruf bereitgestellt.
Danach
ist die Methode immer noch leicht zu lesen, obwohl sie alle Prozesse umfasst.Das obige ist der detaillierte Inhalt vonSo legen Sie ein Berechtigungstoken in PHP fest. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!