php メソッドでトークンを設定します。最初にトークンを取得するためのルーティング パスを定義し、次にサービス層を確立し、次にモデル層でユーザー クラスを作成し、バリデータ クラスで対応する検証メソッドと例外処理を作成します。と例外クラス;最後に Token トークンの書き込みを完了します。
推奨: 「PHP ビデオ チュートリアル 」
開発したバックエンド API インターフェイスには、アクセス許可要件があります。個人情報を含む一部のインターフェイスなど、訪問者はインターフェイスをリクエストする際に、事前に訪問者に発行されたトークンを渡す必要があります。
これはトークンのようなもので、訪問者がそれを示した場合にのみ「通過」します。
以下は、アクセス許可トークンのコード作成のアイデアの記録です。
#1. プロセスの概要トークンを取得するためのルーティング パスを定義し、コード パラメーターを受け入れます (コード ソース: WeChat サーバー、ログイン システムは WeChat システムに基づいています)サービス層を確立し、この層にトークン基本クラスとUserTokenクラスを作成します##UserTokenクラスはロジック全体を処理します:トークンの生成と戻り
##モデルにUserクラスを作成しますサービス層の UserToken 呼び出しのユーザー データ テーブルの読み取りと書き込みを担当する層。バリデータ クラスと例外クラスで対応する検証メソッドと例外処理を作成します。Controller->Service Layer->モデル層が値をサービス層に返します -> サービス層が値をコントローラに返し、プロセス全体でトークンの書き込みが完了します2。具体的な手順最初に、ルーティング パス: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 ]; }
class TokenGet extends BaseValidate { protected $rule = [ 'code' => 'require|isNotEmpty' ]; protected $message = [ 'code' => '需要code才能获得Token!' ]; }
$token = (new UserToken($code))->get();
#モデル層はデータベースを操作してサービス層に返すことのみを担当します
#その後、サービス層がビジネス ロジックを処理して、最終的にコントローラー層に返しますしかし、小規模なプロジェクトの場合、サービスは実際にはモデルと同じレベルにあると思います。いくつかの単純なインターフェイスはモデル層を介してコントローラーに直接接続できるためです。ユーザー権限などの比較的複雑なインターフェイスのみが、さまざまな機能のコードを分離できますサービス層を介して。 このような処理のほうが柔軟性が高く、本当に単純なインターフェースがたくさんある場合には一度Service層を経由する必要がなく、動きをしているようなもので意味がありません。 サービス層のコード記述に戻ります。トークンにはさまざまなタイプがあるため、最初にいくつかの共通メソッドを含むトークン基本クラスを作成します。次に、訪問者にトークンを返す UserToken クラスの準備があります。 これは WeChat に基づいているため、code、appid、appsecret の 3 つの情報が必要です。その後、コンストラクターを通じて UserToken クラスに初期値を割り当てます。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 ); }
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 }
##データベースをチェックし、openid がすでに存在するかどうかを確認します
##存在する場合は処理しません。存在しない場合は、新しいユーザー レコードを追加しますトークンの生成、キャッシュ データの準備、キャッシュへの書き込みトークンをクライアントに返すgenerateToken() メソッドは次のように詳細に定義されています: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; }
以上がPHPでトークンを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。