Yii2에서 OAuth 확장 및 QQ 로그인 실현 방법

6867 단어
본고의 실례는 Yii2에서 OAuth 확장과 QQ 상호작용 로그인 실현 방법을 설명했다.여러분에게 참고하도록 공유하겠습니다. 구체적으로는 다음과 같습니다.

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

Quick start 빠른 시작
Yii2의 구성 파일 config/main을 변경합니다.php,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',
  ],
 ],
 ]
 ...
]


입구 파일을 변경합니다. 일반적으로 app/controllers/Site Controller입니다.php,function actions에 코드를 추가하고 리셋 함수successCallback을 추가합니다. 대체로 다음과 같습니다.

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


로그인한 Views에 다음 코드를 추가합니다.

= yii\authclient\widgets\AuthChoice::widget([
 'baseAuthUrl' => ['site/auth']
])?>


이상은 공식적인 설명서입니다. 다음은 QQ로 연결하겠습니다
QQ 로그인 구성 요소를 추가합니다. 여기는common/components/QqOAuth에 있습니다.php에서 원본 코드는 다음과 같습니다

 [
 * 'authClientCollection' => [
 *  'class' => 'yii\authclient\Collection',
 *  'clients' => [
 *  'qq' => [
 *   'class' => 'common\components\QqOAuth',
 *   'clientId' => 'qq_client_id',
 *   'clientSecret' => 'qq_client_secret',
 *  ],
 *  ],
 * ]
 * ...
 * ]
 * ~~~
 *
 * @see http://connect.qq.com/
 *
 * @author easypao 
 * @since 2.0
 */
class QqOAuth extends OAuth2
{
 public $authUrl = 'https://graph.qq.com/oauth2.0/authorize';
 public $tokenUrl = 'https://graph.qq.com/oauth2.0/token';
 public $apiBaseUrl = 'https://graph.qq.com';
 public function init()
 {
 parent::init();
 if ($this->scope === null) {
  $this->scope = implode(',', [
  'get_user_info',
  ]);
 }
 }
 protected function initUserAttributes()
 {
 $openid = $this->api('oauth2.0/me', 'GET');
 $qquser = $this->api("user/get_user_info", 'GET', ['oauth_consumer_key'=>$openid['client_id'], 'openid'=>$openid['openid']]);
 $qquser['openid']=$openid['openid'];
 return $qquser;
 }
 protected function defaultName()
 {
 return 'qq';
 }
 protected function defaultTitle()
 {
 return 'Qq';
 }
 /**
 *             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('Unable to determine response content type automatically.');
       }
       $response = $this->processResponse($rawResponse, $contentType);
       break;
     }
     case self::CONTENT_TYPE_JSON: {
       $response = Json::decode($rawResponse, true);
       if (isset($response['error'])) {
         throw new Exception('Response error: ' . $response['error']);
       }
       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('Unknown response type "' . $contentType . '".');
     }
   }
   return $response;
 }
}


config/main을 변경합니다.php 파일,components에서 증가, 대체로 다음과 같습니다

'components' => [
 'authClientCollection' => [
   'class' => 'yii\authclient\Collection',
   'clients' => [
     'qq' => [
      'class'=>'common\components\QqOAuth',
      'clientId'=>'your_qq_clientid',
      'clientSecret'=>'your_qq_secret'
    ],
   ],
 ]
]


SiteController.php는 공식대로

public function successCallback($client)
{
 $attributes = $client->getUserAttributes();
 //       $attributes ,                 
 //       QQ    ,     ,     $client->id    。
}


마지막으로 로그인한 보기 파일에 QQ 로그인 링크를 추가합니다

QQ로 빠른 로그인


PS: 편집자는 이 사이트의 php 포맷 미화 도구를 추천합니다. 앞으로 PHP 프로그램 디자인에서 코드 조판을 할 수 있도록 도와줍니다. php 코드 온라인 포맷 미화 도구:http://tools.jb51.net/code/phpformat
Yii 관련 내용에 관심이 많은 독자들은 본 사이트의 주제를 보실 수 있습니다.,,,,,,,,,《php+mysql 데이터베이스 조작 입문 강좌》 및 《php 흔한 데이터베이스 조작 기교 총집합》
이 글은 Yii 프레임워크를 바탕으로 하는 PHP 프로그램 설계에 도움이 되었으면 합니다.

좋은 웹페이지 즐겨찾기