Heim  >  Artikel  >  Backend-Entwicklung  >  Yii2 implementiert die QQ-Internetanmeldung

Yii2 implementiert die QQ-Internetanmeldung

*文
*文Original
2017-12-29 18:54:122151Durchsuche

In diesem Artikel werden hauptsächlich die OAuth-Erweiterung und die QQ-Interconnection-Anmeldemethoden in Yii2 vorgestellt und anhand von Beispielen die relevante Konfiguration der OAuth-Erweiterung und die Implementierungsfähigkeiten der QQ-Interconnection-Anmeldung analysiert. Freunde in Not können darauf verweisen. Ich hoffe, dass es für alle hilfreich ist.

Die Details lauten wie folgt:

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

Schnellstart Schnellstart

Ändern Sie die Yii2-Konfigurationsdatei config/main.php und fügen Sie den folgenden Inhalt in Komponenten hinzu

'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',
  ],
 ],
 ]
 ...
]

Ändern Sie die Eintragsdatei, normalerweise app/controllers/SiteController.php, fügen Sie Code in Funktionsaktionen hinzu und fügen Sie die Rückruffunktion successCallback hinzu, ungefähr wie folgt

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
 }
}

Im protokollierten- Fügen Sie in Ansichten den folgenden Code hinzu


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

Das Obige ist die offizielle Dokumentation. Jetzt greifen wir auf QQ Internet zu

Um QQ-Anmeldekomponenten hinzuzufügen, I Fügen Sie sie hier gemeinsam ein/ In Components/QqOAuth.php lautet der Quellcode wie folgt

<?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;
 }
}

Ändern Sie die Datei config/main.php und fügen Sie sie in Komponenten hinzu, ungefähr wie folgt

&#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;
    ],
   ],
 ]
]

SiteController.php als offizieller Sub

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

Fügen Sie schließlich den QQ-Anmeldelink in die Datei mit der angemeldeten Ansicht ein

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

Verwandte Empfehlungen:

Teilen Sie die Fallstricke, die auftreten, wenn PHP auf QQ zugreift, um sich bei OAuth2.0 anzumelden

oAuth-Authentifizierung und Autorisierung

Detaillierte Erläuterung der Registrierungs- und Erstellungsmethoden von Komponenten in Yii2

Das obige ist der detaillierte Inhalt vonYii2 implementiert die QQ-Internetanmeldung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn