>  기사  >  백엔드 개발  >  TP5 실무 프로젝트에서 QQ 제3자 로그인 기능 구현 사례 공유

TP5 실무 프로젝트에서 QQ 제3자 로그인 기능 구현 사례 공유

黄舟
黄舟원래의
2018-05-28 16:02:553527검색

최근에 웨딩숍 프로젝트를 만들기 위해 thinkPHP 5 프레임워크를 사용했는데, 개발 과정에서 Tencent에서 제공하는 공식 케이스가 서로를 포함한 여러 파일에 배치되었을 때. Tencent의 공식적으로 봉인된 클래스를 사용하려면 컨트롤러에서 예상되는 기능을 완료할 수 없다는 점이 매우 안타깝습니다.

1. 공식 SDK에서 핵심 파일을 찾으세요.

프레임워크 외부에서 사용시, include 'qqConnectAPI.php'를 이 파일을 열어보면, comm 폴더에 있는 다른 파일들도 포함되어 있는 것을 볼 수 있습니다. 단지 몇 가지 상수를 정의하는 것에 지나지 않습니다. APP KEY 및 기타 정보는 관련이 없습니다. 클래스 폴더에 몇 가지 클래스 파일을 넣어두면 실제로는 다음과 같습니다. 세 가지 클래스만 있으면 해당 기능을 완전히 구현할 수 있습니다. include 'qqConnectAPI.php',打开这个文件可以看到它是包含了另外几个文件的,comm文件夹下的几个文件无非就是定义一些常量,记录一下你的APP KEY这些信息,都无关紧要,只要把class文件夹下的几个类文件放到tp5里面就好了,而且仔细看一下代码会发现其实只要拿到三个类就完全可以实现功能了。

2. 放到tp框架里

tp5推荐将第三方的东西,同时又不是composer安装的统一放到extend目录下,因为可能以后还要做其他扩展,这里将qq登录相关的单独建一个qqlogin文件夹,

可以看到里面只有三个类,我去掉了一个Recorder和一个ErrorCase类,见名知意,这两个的作用是记录一些信息,如access_token,还有异常处理,这里我就直接删掉了。另外注意,按照psr4规范,类名要跟文件名一致,所以要把文件名改一下,同时加上命名空间extendqqlogintp5所有的类都要有命名空间

另外为了防止tp5找不到我们需要的文件,最好在config.php文件里注册一条根命名空间,在第30行:

// 注册的根命名空间
'root_namespace'  => [
 'extend\qqlogin' => '../extend/qqlogin/',
 'extend\baidu' => '../extend/bdlogin/'
],

3. 改造源代码

因为QC.php是继承了Oauth.php,我们从后者改起,去掉require_once,加上命名空间这个就不说了,首先看成员属性,类常量是腾讯平台的地址,不用管,原来有三个属性,recorder、error不需要,注释掉或直接删掉。下文同样,要想象跟这两个单词有仇,看到就注释或删掉。

// protected $recorder;
public $urlUtils;
// protected $error;
public $state;
public $appid = "****";
public $callback = "http://****/index/user/qqcallback";
public $scope = "get_user_info";

下面四个属性是需要添加的,state用于防止CSRF攻击,下面三个看官方文档就知道是什么东西了,这些原来是在comm文件夹下的inc.php存放的,现在直接拿过来变成成员属性。

然后构造函数,实例化三个类,有两个已经不存在了,而且上面说了,跟这两个单词有仇,看到就要注释或删掉。

再看下面的第一个成员方法qq_login()

public function qq_login(){
 $appid = $this->recorder->readInc("appid");
 $callback = $this->recorder->readInc("callback");
 $scope = $this->recorder->readInc("scope");
 //---生成唯一随机串防CSRF攻击
 $state = md5(uniqid(rand(), TRUE));
 $this->recorder->write('state',$state);
 *
 *
 return $login_url;
 // header("Location:$login_url");
}

我们已经有仇把有那两个单词的这几行删掉了,我们又需要这些东西,不要忘了我们上面增加了三个成员属性,这些值我们已经有了下面用的时候通过$this->appid就好了。state验证的时候我们可以通过session去验证,在tp5里面提供了助手函数去写session:

session('state',$this->state);

最后一句是header跳转,暂不知道什么原因在tp5里面并不能看到跳转效果,于是直接将url返回,再在控制器里面通过tp5的重定向函数$this->redirect()实现跳转。

下面看qq_callback()

public function qq_callback(){
 // $state = $this->recorder->read("state");
 //---验证state防止CSRF攻击
 if(input('state') != session('state')){
  // $this->error("30001");
  exit('30001');
 }
 *
 *
 // return $params["access_token"];
 session('access_token',$params["access_token"]);
}

出现那两个单词的已经注释了,我们在qq_login里面有写session,这里直接取sessio比较就行了,input()也是tp5的助手函数,可以获得get、post请求的参数,结果是一个数组,但是不能够再动态为其添加键值对,想要添加的话必须将其赋给一个变量,再对变量进行操作。这里有错误的话直接exit打印出错误号,官方文档有详细的错误号说明。在最后也是直接将获取到的access_token写进session。

下面的get_openid()

2. tp 프레임워크에 넣습니다.

tp5는 나중에 다른 확장이 필요할 수 있으므로 작곡가가 설치하지 않은 타사 항목을 확장 디렉터리에 넣을 것을 권장합니다. 여기에 qq 로그인 관련이 있습니다. 별도의 qqlogin 폴더를 만들 수 있습니다,

클래스가 3개뿐이므로 Recorder와 ErrorCase 클래스를 제거했습니다. 이름에서 알 수 있듯이 이 두 클래스의 기능은 access_token 및 예외 처리와 같은 일부 정보를 기록하는 것이므로 여기에서 직접 삭제했습니다. 또한 psr4 사양에 따르면 클래스 이름은 파일 이름과 일치해야 하므로 파일 이름을 변경하고 네임스페이스

extendqqlogin을 추가해야 합니다. 모든 클래스. tp5에는 네임스페이스 가 있어야 합니다.

또한 tp5가 필요한 파일을 찾지 못하게 하려면 30행의 config.php 파일에 루트 네임스페이스를 등록하는 것이 가장 좋습니다.

$this->keysArr = array(
 "oauth_consumer_key" => (int)$this->appid,
 "access_token" => session('access_token'),
 "openid" => session('openid')
);
3 소스 코드 변환

🎜 🎜QC 때문에 php는 Oauth.php를 상속하고, require_once를 제거하고, 네임스페이스를 추가하겠습니다. 먼저, 클래스 상수는 Tencent의 주소입니다. platform. 원래 세 가지 속성이 있으므로 오류는 필요하지 않으므로 주석 처리하거나 직접 삭제하세요. 아래에서도 마찬가지입니다. 이 두 단어에 대해 원한이 있다고 상상하고, 해당 단어를 보면 댓글을 달거나 삭제해야 합니다. 🎜
use extend\qqlogin\QC;
// 处理qq登录
public function qqlogin()
{
 $qq = new QC();
 $url = $qq->qq_login();
 $this->redirect($url);
}
// qq登录回调函数
public function qqcallback(UserModel $user)
{
 $qq = new QC();
 $qq->qq_callback();
 $qq->get_openid();
 $qq = new QC();
 $datas = $qq->get_user_info();
 * // 拿到用户信息后的处理
 *
}
🎜다음 4가지 속성을 추가해야 합니다. State는 CSRF 공격을 방지하는 데 사용됩니다. 공식 문서를 보면 다음 3가지가 원래 comm 폴더 아래에 저장되어 있음을 알 수 있습니다. 직접 오셔서 회원 속성이 되십시오. 🎜🎜그런 다음 함수를 구성하고 세 개의 클래스를 인스턴스화합니다. 그 중 두 개는 더 이상 존재하지 않으며 위에서 언급한 것처럼 이 두 단어는 서로 관련되어 있습니다. 🎜🎜qq_login() 아래 첫 번째 멤버 메소드를 보세요🎜rrreee🎜저희는 이미 해당 두 단어가 포함된 행을 삭제했으며 이러한 내용이 다시 필요합니다. 잊지 마세요. 세 가지 멤버 속성을 추가했습니다. 위에는 이미 이러한 값이 있으며 아래에서 사용할 때는 $this->appid를 전달하면 됩니다. 상태를 확인할 때 세션을 통해 확인할 수 있습니다. TP5는 세션 작성 보조 기능을 제공합니다. 🎜rrreee🎜마지막 문장은 헤더 점프인데 왜 TP5에서 점프 효과가 보이지 않는지 모르겠어서 직접 Return합니다. url을 입력한 다음 tp5 리디렉션 함수 $this->redirect()를 사용하여 컨트롤러에서 점프를 구현합니다. 🎜🎜아래의 qq_callback()을 보세요🎜rrreee🎜나타나는 두 단어가 주석 처리되어 있습니다. 우리는 qq_login에 session을 작성했습니다. sessio와 직접 비교하면 tp5의 보조 기능이기도 합니다. 요청한 매개변수의 결과는 배열이지만, 키-값 쌍을 동적으로 추가할 수는 없으므로 변수에 할당한 후 변수를 연산해야 합니다. 여기에 오류가 있으면 종료하고 오류 번호를 인쇄하세요. 공식 문서에는 자세한 오류 번호 설명이 있습니다. 마지막에는 획득한 access_token이 세션에 직접 기록됩니다. 🎜🎜아래의 get_openid() 메서드도 유사합니다. 매개변수 목록은 세션을 사용하여 구성되며 반환 값은 세션에 직접 기록됩니다. 🎜🎜그런 다음 QC.php를 수정하고 구성 방법을 수정하고 배열의 세 변수에 값을 지정하면 됩니다. 🎜rrreee🎜🎜🎜4. 컨트롤러 호출 🎜🎜🎜🎜의 변환이 완료되었으며 컨트롤러에서 사용할 수 있습니다. 코드는 아래에 첨부되어 있습니다. 🎜rrreee🎜🎜잊기 쉽습니다. 🎜🎜🎜🎜에서 인스턴스화해야 합니다. 콜백 함수 사용자 정보를 가져오려면 두 개의 QC가 필요합니다. 두 번째로 인스턴스화되면 🎜openid🎜 및 🎜access_token🎜이라는 두 가지 매개변수가 있습니다. 🎜

위 내용은 TP5 실무 프로젝트에서 QQ 제3자 로그인 기능 구현 사례 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.