Yii2 implements QQ Internet login

*文
Release: 2023-03-18 19:44:01
Original
2158 people have browsed it

This article mainly introduces the OAuth extension and QQ interconnection login methods in Yii2, and analyzes the relevant configuration of the OAuth extension and the implementation skills of QQ interconnection login with examples. Friends in need can refer to it. I hope it will be helpful to everyone.

The details are as follows:

php composer.phar require --prefer-dist yiisoft/yii2-authclient "*"
Copy after login

Quick start Quick start

Change the Yii2 configuration file config/main.php and add the following content to components

'components' => [
 'authClientCollection' => [
 'class' => 'yii\authclient\Collection',
 'clients' => [
  'google' => [
  'class' => 'yii\authclient\clients\GoogleOpenId'
  ],
  'facebook' => [
  'class' => 'yii\authclient\clients\Facebook',
  'clientId' => 'facebook_client_id',
  'clientSecret' => 'facebook_client_secret',
  ],
 ],
 ]
 ...
]
Copy after login

Change the entry file, usually app/controllers/SiteController.php, add code in function actions, and add the callback function successCallback, roughly as follows

class SiteController extends Controller
{
 public function actions()
 {
 return [
  'auth' => [
  'class' => 'yii\authclient\AuthAction',
  'successCallback' => [$this, 'successCallback'],
  ],
 ]
 }
 public function successCallback($client)
 {
 $attributes = $client->getUserAttributes();
 // user login or signup comes here
 }
}
Copy after login

In the logged-in Views, add the following code


<?= yii\authclient\widgets\AuthChoice::widget([
 &#39;baseAuthUrl&#39; => [&#39;site/auth&#39;]
])?>
Copy after login

The above is the official documentation. Now let’s access QQ Internet

To add QQ login components, I put them in common/components/QqOAuth.php. Source The code is as follows

<?php
namespace common\components;
use yii\authclient\OAuth2;
use yii\base\Exception;
use yii\helpers\Json;
/**
 *
 * ~~~
 * &#39;components&#39; => [
 * &#39;authClientCollection&#39; => [
 *  &#39;class&#39; => &#39;yii\authclient\Collection&#39;,
 *  &#39;clients&#39; => [
 *  &#39;qq&#39; => [
 *   &#39;class&#39; => &#39;common\components\QqOAuth&#39;,
 *   &#39;clientId&#39; => &#39;qq_client_id&#39;,
 *   &#39;clientSecret&#39; => &#39;qq_client_secret&#39;,
 *  ],
 *  ],
 * ]
 * ...
 * ]
 * ~~~
 *
 * @see http://connect.qq.com/
 *
 * @author easypao <admin@easypao.com>
 * @since 2.0
 */
class QqOAuth extends OAuth2
{
 public $authUrl = &#39;https://graph.qq.com/oauth2.0/authorize&#39;;
 public $tokenUrl = &#39;https://graph.qq.com/oauth2.0/token&#39;;
 public $apiBaseUrl = &#39;https://graph.qq.com&#39;;
 public function init()
 {
 parent::init();
 if ($this->scope === null) {
  $this->scope = implode(&#39;,&#39;, [
  &#39;get_user_info&#39;,
  ]);
 }
 }
 protected function initUserAttributes()
 {
 $openid = $this->api(&#39;oauth2.0/me&#39;, &#39;GET&#39;);
 $qquser = $this->api("user/get_user_info", &#39;GET&#39;, [&#39;oauth_consumer_key&#39;=>$openid[&#39;client_id&#39;], &#39;openid&#39;=>$openid[&#39;openid&#39;]]);
 $qquser[&#39;openid&#39;]=$openid[&#39;openid&#39;];
 return $qquser;
 }
 protected function defaultName()
 {
 return &#39;qq&#39;;
 }
 protected function defaultTitle()
 {
 return &#39;Qq&#39;;
 }
 /**
 * 该扩展初始的处理方法似乎QQ互联不能用,应此改写了方法
 * @see \yii\authclient\BaseOAuth::processResponse()
 */
 protected function processResponse($rawResponse, $contentType = self::CONTENT_TYPE_AUTO)
 {
   if (empty($rawResponse)) {
     return [];
   }
   switch ($contentType) {
     case self::CONTENT_TYPE_AUTO: {
       $contentType = $this->determineContentTypeByRaw($rawResponse);
       if ($contentType == self::CONTENT_TYPE_AUTO) {
   //以下代码是特别针对QQ互联登录的,也是与原方法不一样的地方 
         if(strpos($rawResponse, "callback") !== false){
           $lpos = strpos($rawResponse, "(");
           $rpos = strrpos($rawResponse, ")");
           $rawResponse = substr($rawResponse, $lpos + 1, $rpos - $lpos -1);
           $response = $this->processResponse($rawResponse, self::CONTENT_TYPE_JSON);
           break;
         }
   //代码添加结束
         throw new Exception(&#39;Unable to determine response content type automatically.&#39;);
       }
       $response = $this->processResponse($rawResponse, $contentType);
       break;
     }
     case self::CONTENT_TYPE_JSON: {
       $response = Json::decode($rawResponse, true);
       if (isset($response[&#39;error&#39;])) {
         throw new Exception(&#39;Response error: &#39; . $response[&#39;error&#39;]);
       }
       break;
     }
     case self::CONTENT_TYPE_URLENCODED: {
       $response = [];
       parse_str($rawResponse, $response);
       break;
     }
     case self::CONTENT_TYPE_XML: {
       $response = $this->convertXmlToArray($rawResponse);
       break;
     }
     default: {
       throw new Exception(&#39;Unknown response type "&#39; . $contentType . &#39;".&#39;);
     }
   }
   return $response;
 }
}
Copy after login

Change the config/main.php file and add it in components, roughly as follows

&#39;components&#39; => [
 &#39;authClientCollection&#39; => [
   &#39;class&#39; => &#39;yii\authclient\Collection&#39;,
   &#39;clients&#39; => [
     &#39;qq&#39; => [
      &#39;class&#39;=>&#39;common\components\QqOAuth&#39;,
      &#39;clientId&#39;=>&#39;your_qq_clientid&#39;,
      &#39;clientSecret&#39;=>&#39;your_qq_secret&#39;
    ],
   ],
 ]
]
Copy after login

SiteController.php just like the official one

public function successCallback($client)
{
 $attributes = $client->getUserAttributes();
 // 用户的信息在$attributes中,以下是您根据您的实际情况增加的代码
 // 如果您同时有QQ互联登录,新浪微博等,可以通过 $client->id 来区别。
}
Copy after login

Finally log in Add the QQ login link to the view file

<a href="/site/auth?authclient=qq">使用QQ快速登录</a>
Copy after login

Related recommendations:

Encountered when accessing QQ login OAuth2.0 Pit sharing

oAuth authentication and authorization

Registration of components in Yii2 and Detailed explanation of the creation method

The above is the detailed content of Yii2 implements QQ Internet login. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template