>  기사  >  PHP 프레임워크  >  QQ 인터넷에 연결하여 로그인을 구현한 ThinkPHP 사례 분석

QQ 인터넷에 연결하여 로그인을 구현한 ThinkPHP 사례 분석

angryTom
angryTom앞으로
2020-03-05 11:35:343309검색

이 글은 ThinkPHP를 사용하여 QQ 인터넷에 연결하여 타사 로그인을 구현하는 방법을 소개하는 데 도움이 되기를 바랍니다.

QQ 인터넷에 연결하여 로그인을 구현한 ThinkPHP 사례 분석

로그인 구현을 위해 QQ 인터넷에 연결한 ThinkPHP 사례 분석

제 2차 도메인 이름 프로젝트 중 하나도 QQ 타사 로그인 기능에 연결하려고 합니다. 해당 프로젝트는 thinkphp5 프레임워크를 사용하여 개발되었습니다. 일부 액세스 사례를 검색한 결과 개인적으로 좋은 것과 나쁜 것이 혼합된 가방이 나에게 적합하지 않다고 느꼈습니다. 이제 thinkphp5 프레임워크에서 이 기능을 다시 개발하고 있습니다. 다음은 자세한 개발 단계입니다.

(추천 튜토리얼: thinkphp 튜토리얼)

첫 번째 단계는 thinkphp5 프레임워크를 기반으로 하는 QQ 인터넷 SDK를 다운로드하는 것입니다. 물론 다운로드한 파일은 PHP 버전을 사용해야 합니다. 디렉토리는 다음과 같습니다.

QQ 인터넷에 연결하여 로그인을 구현한 ThinkPHP 사례 분석

두 번째 단계는 SDK의 기본 디렉터리를 서버의 해당 디렉터리에 업로드하는 것입니다. 먼저 SDK의 기본 디렉터리는 API 폴더의 클래스 디렉터리입니다. 설치 폴더를 업로드한 후 개발 환경에서 APP ID, APP Key, callback_url을 구성합니다. 구성을 마치면 API/comm 폴더에 inc.php 구성 파일이 생기고 마지막으로 이 구성 파일이 참조됩니다. 녹음 수업. 그러나 후속 개발 과정에서 다음 오류가 보고되는 것을 발견했습니다. 상태가 일치하지 않습니다. You may be thevictory CSRF. 나중에는 qqlogin 메소드로 상태를 세션에 넣었는데, 공식 홈페이지의 DEMO SDK에 대한 신뢰가 완전히 없어져서 QQ를 사용해 모든 파일을 연결하는 대신 개발에 필요한 몇 가지 중요한 클래스 파일을 선택했습니다. 나중에는 공식 SDK가 그냥 일반적인 PHP 코드 형식인줄 알았는데 thinkphp에 적용한 것들이 많이 바뀌어서 마지막 클래스 파일인 QC.php, URL.php, Oauth.php를 선택해서 올려봤습니다. 확장/qqlogin 디렉토리. thinkphp5 프로젝트에서 확장 클래스는 일반적으로 내 마지막 디렉터리 위치 아래 그림에 표시된 것처럼 확장 폴더에 업로드됩니다.

QQ 인터넷에 연결하여 로그인을 구현한 ThinkPHP 사례 분석

세 번째 단계는 위의 세 가지 클래스 파일을 변환하는 것입니다. QC.php는 Oauth.php를 상속하므로 후자부터 시작하여 require_once를 제거하고 네임스페이스 qqlogin을 추가합니다. 먼저 멤버 속성을 살펴보세요. . 클래스 상수는 Tencent 플랫폼의 주소입니다. 원래는 세 가지 속성이 있으므로 주석 처리하거나 직접 삭제할 필요는 없습니다. 아래도 마찬가지입니다. 5개의 클래스 파일 중 3개의 클래스 파일만 사용하기 때문입니다. 하나는 오류 보고 클래스이고 다른 하나는 읽기 구성 관련 클래스입니다. Oauth.php 멤버 속성, qqlogin 점프 메소드, qqcallback 콜백 메소드를 살펴보겠습니다. 다른 두 클래스 파일은 크게 변경되지 않았습니다. 위 규칙에 따라 변경하면 됩니다.

<?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"]);
    }
}

네 번째 단계는 컨트롤러 호출 함수를 작성하는 것입니다. 콜백 기능을 수행하고 콜백 주소가 올바른지 확인합니다. (콜백 주소는 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를 콜백 함수에서 두 번 인스턴스화해야 한다는 점은 주목할 가치가 있습니다. 두 번째로 인스턴스화될 때만 openid와 access_token 두 매개변수가 있습니다.

더 많은 Thinkphp 튜토리얼을 보려면 PHP 중국어 웹사이트를 주목하세요!

위 내용은 QQ 인터넷에 연결하여 로그인을 구현한 ThinkPHP 사례 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 www.100txy.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제