ホームページ >バックエンド開発 >PHPの問題 >PHPでパーミッショントークンを設定する方法

PHPでパーミッショントークンを設定する方法

藏色散人
藏色散人オリジナル
2020-08-20 10:13:002668ブラウズ

トークンを設定するための

php メソッド: 1. トークンを取得するためのルーティング パスを定義します; 2. サービス層を確立します; 3. UserToken クラスを使用してロジック全体を処理します; 4. ユーザー クラスをモデル層; 5. 検証 ハンドラクラスと例外クラスに、対応する検証メソッドと例外ハンドリングを作成します。

PHPでパーミッショントークンを設定する方法

推奨: 「PHP ビデオ チュートリアル

PHP_Set Permission Token Token

私たちが開発するバックエンド API インターフェースには訪問者に対する権限要件があります。たとえば、個人情報を含む一部のインターフェースでは、インターフェースをリクエストする際に、訪問者に事前に発行されたトークンを渡す必要があります。

これはトークンのようなもので、訪問者がそれを示した場合にのみ「通過」します。

以下は、アクセス許可トークンのコード作成のアイデアの記録です。


1. プロセスの概要

  • トークンを取得するためのルーティング パスを定義し、コード パラメーターを受け入れます (コード ソース: WeChat サーバー、ログイン システムのベース) WeChat システム上)

  • Service レイヤーを確立し、このレイヤーに Token 基本クラスと UserToken クラスを作成します

  • ##UserToken クラスは次の処理を行います。ロジック全体: トークンの生成と戻り

  • モデル層に User クラスを作成します。これはユーザー データ テーブルの読み取りと書き込みを担当し、サービス層での UserToken 呼び出しに使用されます。

  • バリデータークラスと例外クラスで対応する検証メソッドと例外処理を作成します

  • コントローラー -> サービス層 -> モデル層サービス層に値を返す -> サービス層がコントローラに値を返す、全プロセス トークンの書き込みを完了

2. 具体的な手順

最初にルーティング パスを定義します:

Route::post(
    'api/:version/token/user',
    'api/:version.Token/getToken'
);

次に、トークン コントローラーを作成し、対応するルートを定義します。パスの getToken メソッド:

public function getToken($code='') {
        (new TokenGet())->goCheck($code); // 验证器
        $token = (new UserToken($code))->get();
        return [
            'token' => $token
        ];
    }

サービス層を呼び出す前に、渡されたパラメーターを確認する必要があるため、TokenGet を定義します。バリデータ:

class TokenGet extends BaseValidate
{
    protected $rule = [
      'code' => 'require|isNotEmpty'
    ];

    protected $message = [
        'code' => '需要code才能获得Token!'
    ];
 }

トークン コントローラーに戻り、検証に合格した後、サービス層によって定義された UserToken クラスを呼び出します。

$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
    );
    }

次に、これらを入力します。 WeChat によって提供されるインターフェイスのパラメーター位置の目的は、完全な WeChat サーバー側 URL を取得し、必要な openid を要求することです。

その後、ネットワーク要求を送信するステップはここではスキップされます。 WeChat サーバーは、openid を含むオブジェクトを返します。このオブジェクトの値が OK であると判断した後、トークンを生成するステップを開始します。関数 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
}

ご覧のとおり、コアプロセスは次のとおりです:

##openid を取得します
  • データベースをチェックし、openid がすでに存在するかどうかを確認します
  • 存在する場合は処理されません。存在しない場合は、新しいユーザー レコードが追加されます
  • トークンを生成し、キャッシュ データを準備し、キャッシュに書き込みます
  • トークンをクライアントに返します
generateToken()

このメソッドは次のように詳細に定義されています。 <pre class="brush:js;toolbar:false">public static function generateToken() { $randomChars = getRandomChars(32); // 32个字符组成一组随机字符串 $timestamp = $_SERVER[&amp;#39;REQUEST_TIME_FLOAT&amp;#39;]; $salt = config(&amp;#39;security.token_salt&amp;#39;); // salt 盐 // 拼接三组字符串,进行MD5加密,然后返回 return md5($randomChars.$timestamp.$salt); } function getRandomChars($length) { $str = null; $strPoll = &amp;#39;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&amp;#39;; $max = strlen($strPoll) - 1; for ($i = 0; $i &lt; $length; $i++) { $str .= $strPoll[rand(0, $max)]; } return $str; }</pre> その主な機能は間違いなく、必要なトークン (トークン文字列) を生成することです。

generateToken()

は他のタイプのトークンでも使用されるため、Token 基本クラスに配置されることに注意してください。 この時点で必要なのは、生成されたトークンをコントローラーに返すことだけです。

3. 概要

トークンの書き込みには多くのプロセスが含まれるため、混乱を避けるために、さまざまなメソッドでさまざまなタスクを実行するコードを定義することに注意する必要があります。上の例の

grantToken()

メソッドに示されているように、これはすべてのプロセスを含むコア メソッドですが、別の特定のプロセスが他のメソッドで定義されてから grantToken()# に提供されます。 #メソッド呼び出し。 これを実行した後、grantToken()

メソッドにはすべてのプロセスが含まれていますが、それでも読みやすいです。

以上がPHPでパーミッショントークンを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。