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

이 글은 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으로 문의하시기 바랍니다. 삭제
thinkphp是不是国产框架thinkphp是不是国产框架Sep 26, 2022 pm 05:11 PM

thinkphp是国产框架。ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。

一起聊聊thinkphp6使用think-queue实现普通队列和延迟队列一起聊聊thinkphp6使用think-queue实现普通队列和延迟队列Apr 20, 2022 pm 01:07 PM

本篇文章给大家带来了关于thinkphp的相关知识,其中主要介绍了关于使用think-queue来实现普通队列和延迟队列的相关内容,think-queue是thinkphp官方提供的一个消息队列服务,下面一起来看一下,希望对大家有帮助。

thinkphp的mvc分别指什么thinkphp的mvc分别指什么Jun 21, 2022 am 11:11 AM

thinkphp基于的mvc分别是指:1、m是model的缩写,表示模型,用于数据处理;2、v是view的缩写,表示视图,由View类和模板文件组成;3、c是controller的缩写,表示控制器,用于逻辑处理。mvc设计模式是一种编程思想,是一种将应用程序的逻辑层和表现层进行分离的方法。

实例详解thinkphp6使用jwt认证实例详解thinkphp6使用jwt认证Jun 24, 2022 pm 12:57 PM

本篇文章给大家带来了关于thinkphp的相关知识,其中主要介绍了使用jwt认证的问题,下面一起来看一下,希望对大家有帮助。

thinkphp扩展插件有哪些thinkphp扩展插件有哪些Jun 13, 2022 pm 05:45 PM

thinkphp扩展有:1、think-migration,是一种数据库迁移工具;2、think-orm,是一种ORM类库扩展;3、think-oracle,是一种Oracle驱动扩展;4、think-mongo,一种MongoDb扩展;5、think-soar,一种SQL语句优化扩展;6、porter,一种数据库管理工具;7、tp-jwt-auth,一个jwt身份验证扩展包。

thinkphp 怎么查询库是否存在thinkphp 怎么查询库是否存在Dec 05, 2022 am 09:40 AM

thinkphp查询库是否存在的方法:1、打开相应的tp文件;2、通过“ $isTable=db()->query('SHOW TABLES LIKE '."'".$data['table_name']."'");if($isTable){...}else{...}”方式验证表是否存在即可。

一文教你ThinkPHP使用think-queue实现redis消息队列一文教你ThinkPHP使用think-queue实现redis消息队列Jun 28, 2022 pm 03:33 PM

本篇文章给大家带来了关于ThinkPHP的相关知识,其中主要整理了使用think-queue实现redis消息队列的相关问题,下面一起来看一下,希望对大家有帮助。

thinkphp3.2怎么关闭调试模式thinkphp3.2怎么关闭调试模式Apr 25, 2022 am 10:13 AM

在thinkphp3.2中,可以利用define关闭调试模式,该标签用于变量和常量的定义,将入口文件中定义调试模式设为FALSE即可,语法为“define('APP_DEBUG', false);”;开启调试模式将参数值设置为true即可。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.