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

PHPでトークンを設定する方法

PHPz
PHPzオリジナル
2020-09-25 14:06:484429ブラウズ

php メソッドでトークンを設定します。最初にトークンを取得するためのルーティング パスを定義し、次にサービス層を確立し、次にモデル層でユーザー クラスを作成し、バリデータ クラスで対応する検証メソッドと例外処理を作成します。と例外クラス;最後に Token トークンの書き込みを完了します。

PHPでトークンを設定する方法

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

開発したバックエンド API インターフェイスには、アクセス許可要件があります。個人情報を含む一部のインターフェイスなど、訪問者はインターフェイスをリクエストする際に、事前に訪問者に発行されたトークンを渡す必要があります。

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

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

#1. プロセスの概要

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

サービス層を確立し、この層にトークン基本クラスとUserTokenクラスを作成します

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

##モデルにUserクラスを作成しますサービス層の UserToken 呼び出しのユーザー データ テーブルの読み取りと書き込みを担当する層。

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

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

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() メソッドは次のように詳細に定義されています:

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 = &#39;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&#39;;    $max = strlen($strPoll) - 1;    for ($i = 0; $i < $length; $i++) {        $str .= $strPoll[rand(0, $max)];
    }    return $str;
}

その主な機能は明確ではありません。必要なトークン、つまりトークン文字列を生成することであることは間違いありません。 generateToken() は他のタイプのトークンでも使用されるため、Token 基本クラスに配置されることに注意してください。

この時点で必要なのは、生成されたトークンをコントローラーに返すことだけです。

3. 概要

トークンの書き込みには多くのプロセスが含まれるため、混乱を避けるために、さまざまなメソッドでさまざまなタスクを実行するコードを定義することに注意する必要があります。上の例の GrantToken() メソッドに示されているように、これはすべてのプロセスを含むコア メソッドですが、別の特定のプロセスが他のメソッドで定義され、grantToken() メソッド呼び出しに提供されます。

これを実行すると、すべてのプロセスが含まれているにもかかわらず、grantToken() メソッドは読みやすくなります。

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

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