ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP を QQ インターネットに接続してログインを実現する事例分析

ThinkPHP を QQ インターネットに接続してログインを実現する事例分析

angryTom
angryTom転載
2020-03-05 11:35:343312ブラウズ

この記事では、ThinkPHP を使用して QQ Internet にアクセスし、サードパーティ ログインを実現する方法を、小さなケースとして説明します。

ThinkPHP を QQ インターネットに接続してログインを実現する事例分析

ThinkPHP が QQ インターネットに接続してログインを実現する事例分析

第 2 レベル ドメイン名プロジェクトに接続したいQQサードパーティログイン機能、このプロジェクトはthinkphp5フレームワークを使用して開発されています。インターネットでいくつかのアクセス事例を調べました。個人的には良いことも悪いことも混在しているのは自分には向いていないと感じました。現在、この機能を再開発中です。 thinkphp5 フレームワーク上での詳細な開発手順は次のとおりです。

(推奨チュートリアル: thinkphp チュートリアル)

最初のステップは、QQ Internet SDK をダウンロードすることです。これは thinkphp5 フレームワークに基づいています。 PHP版のSDKを使用する必要があります。ダウンロード後のファイルディレクトリは次のとおりです。

ThinkPHP を QQ インターネットに接続してログインを実現する事例分析

2 番目のステップは、SDK のメイン ディレクトリをサーバー上の適切なディレクトリにアップロードすることです。まず、SDK のメイン ディレクトリがクラス ディレクトリであることについて説明します。もともと、構成設定をテストするために、インストール フォルダーをアップロードし、開発環境で APP ID、APP キー、callback_url を構成しました。構成後、inc.php 構成ファイルがAPI/comm フォルダー、最後にレコーダー この設定ファイルはクラス内で参照されます。しかし、その後の開発プロセス中に、「状態が一致しません。CSRF の被害者である可能性があります。」というエラーが報告されることがわかりました。その後、qqlogin メソッドの状態をセッションに入れましたが、公式 Web サイトの DEMO SDK に完全に自信を失っていたので、QQ を使用してすべてのファイルを接続する代わりに、開発用に重要なクラス ファイルをいくつか選択しました。後で考えると、公式 SDK は一般的な PHP コード形式にすぎません。thinkphp に適用した多くの点が変更されました。最後に、最後のクラス ファイルである QC.php、URL.php、および Oauth.php を選択し、拡張するためにアップロードしました。 /qqlogin コンテンツの下。 thinkphp5 プロジェクトでは、最後のディレクトリの場所の下の図に示すように、拡張クラスは通常 extend フォルダーにアップロードされます。

ThinkPHP を QQ インターネットに接続してログインを実現する事例分析

3 番目のステップは、上記 3 つのクラス ファイルを変換することです。QC.php は Oauth.php を継承しているため、後者から変更し、require_once を削除し、For という名前を追加します。名前空間 qqlogin などのスペース、まずメンバー属性を確認します。クラス定数は Tencent プラットフォームのアドレスです。気にしないでください。属性は元々 3 つあります。レコーダーとエラーは必要ありません。コメントアウトするか削除してください。彼らを直接。以下でも同様です。5 つのクラス ファイルのうち 3 つのクラス ファイルのみを使用します。1 つはエラー報告クラスで、もう 1 つは読み取り設定関連クラスです。 Oauth.php のメンバー属性、qqlogin ジャンプ メソッド、および qqcallback コールバック メソッドを見てみましょう。他の 2 つのクラス ファイルはあまり変更されていません。上記のルールに従って変更するだけです。

<?php
/* PHP SDK
 * @version 2.0.0
 * @author connect@qq.com
 * @copyright © 2013, Tencent Corporation. All rights reserved.
 */
namespace qqlogin;
use qqlogin;
class Oauth{
    const VERSION = "2.0";
    const GET_AUTH_CODE_URL = "https://graph.qq.com/oauth2.0/authorize";
    const GET_ACCESS_TOKEN_URL = "https://graph.qq.com/oauth2.0/token";
    const GET_OPENID_URL = "https://graph.qq.com/oauth2.0/me";
    // protected $recorder;
    public $urlUtils;
    // protected $error;
    
    function __construct(){
        // $this->recorder = new Recorder();
        $this->urlUtils = new URL();
        // $this->error = new ErrorCase();
    }
    public function qq_login(){
        // $appid = $this->recorder->readInc("appid");
        // $callback = $this->recorder->readInc("callback");
        // $scope = $this->recorder->readInc("scope");
        $appid = $this->appid;
        $callback = $this->callback;
        $scope = $this->scope;
        //-------生成唯一随机串防CSRF攻击
        $state = md5(uniqid(rand(), TRUE));
        // $this->recorder->write(&#39;state&#39;,$state);
        session(&#39;state&#39;,$state);
        //-------构造请求参数列表
        $keysArr = array(
            "response_type" => "code",
            "client_id" => $appid,
            "redirect_uri" => $callback,
            "state" => $state,
            "scope" => $scope
        );
        $login_url =  $this->urlUtils->combineURL(self::GET_AUTH_CODE_URL, $keysArr);
        return $login_url;
    }
    public function qq_callback(){
        // $state = $this->recorder->read("state");
        //--------验证state防止CSRF攻击
        if(input(&#39;state&#39;) != session(&#39;state&#39;)){
            // $this->error->showError("30001");
            exit(&#39;30001&#39;);
        }
        //-------请求参数列表
        $keysArr = array(
            "grant_type" => "authorization_code",
            "client_id" => $this->appid,
            "redirect_uri" => urlencode($this->callback),
            "client_secret" => $this->appkey,
            "code" => $_GET[&#39;code&#39;]
        );
        //------构造请求access_token的url
        $token_url = $this->urlUtils->combineURL(self::GET_ACCESS_TOKEN_URL, $keysArr);
        $response = $this->urlUtils->get_contents($token_url);
        if(strpos($response, "callback") !== false){
            $lpos = strpos($response, "(");
            $rpos = strrpos($response, ")");
            $response  = substr($response, $lpos + 1, $rpos - $lpos -1);
            $msg = json_decode($response);
            // if(isset($msg->error)){
            //     $this->error->showError($msg->error, $msg->error_description);
            // }
        }
        $params = array();
        parse_str($response, $params);
        // $this->recorder->write("access_token", $params["access_token"]);
        // return $params["access_token"];
        session(&#39;access_token&#39;,$params["access_token"]);
    }
}

4 番目のステップは次のとおりです。コントローラーを書き込みます。関数とコールバック関数を呼び出し、コールバック アドレスが正しいかどうかを確認します (コールバック アドレスは、QQ サードパーティ ログインを QQ インターネットに追加するときに返されるジャンプ アドレスです。このアドレスには重要なパラメーターが含まれており、場合によっては、QQ インターネットによって入力されたコールバック アドレスがコントローラのアドレスと異なる場合、QQ インターネットによって入力されたコールバック アドレス (www.100txy.com/index など) でスタックしてしまうことがあります。 .php?code=65B7668A4F1BBB71DD0DF52B55AC1FC1&state=804e921e18e3545ecdf690316639c067。以下はコントローラー メソッドです

use qqlogin\QC;
// 处理qq登录
    public function qqlogin(){
        $qq = new QC();
        $url = $qq->qq_login();
        $this->redirect($url);
    }
    // qq登录回调函数
    public function qqcallback(){
        $qq = new QC();
        $qq->qq_callback();
        $qq->get_openid();
        $qq = new QC();
        $datas = $qq->get_user_info();
        die(var_dump($datas));//为用户数据
    }

ユーザー情報を取得するには、コールバック関数で QC を 2 回インスタンス化する必要があることに注意してください。インスタンス化される 2 回目にのみ、openid と access_token の 2 つのパラメーターが含まれます。

その他の Thinkphp チュートリアルについては、PHP 中国語 Web サイト に注目してください。

以上がThinkPHP を QQ インターネットに接続してログインを実現する事例分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はwww.100txy.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。