2015-04-08 2 views
1

Я использую CakePHP 3.x для создания страницы может сделать социальный знак. Я нашел, что плагин HybridAuth может это сделать. Но я не могу понять о конфигурации и потоке. Кто привык к этому плагину?Как использовать гибридный плагин с CakePHP 3.x?

Пожалуйста, помогите мне.

ответ

8

Прежде всего, я должен поблагодарить мой друг за то, что помог мне решить эту тайну в cakephp 3.

Я предоставляю все варианты использования плагина в cakephp 3, может ли это дать решение и изучить дополнительные улучшения в этом плагине.

Шаг 1: Run в композитора

php composer.phar require hybridauth/hybridauth:~2.5.0 

Это необходимо установить плагин в следующем пути,

/your-app-folder/vendor/hybridauth/.. 

Шаг 2: Инициализировать плагин.

A. Измените файл config.php в следующей папке,

/your-app-folder/vendor/hybridauth/hybridauth/hybridauth/config.php 

до требуемого способа, как добавить идентификатор приложения и секретный идентификатор и т.д.

$config = array(
      "base_url" => "http://localhost/your-app-folder/users/social_redirect/",//You have to change the above according to yours 

      "providers" => array(
       // openid providers 
       "OpenID" => array(
        "enabled" => true 
       ), 
       "Yahoo" => array(
        "enabled" => true, 
        "keys" => array("key" => "", "secret" => ""), 
       ), 
       "AOL" => array(
        "enabled" => true 
       ), 
       "Google" => array(
        "enabled" => true, 
        "keys" => array("id" => "", "secret" => ""), 
       ), 
       "Facebook" => array(
        "enabled" => true, 
        "keys" => array("id" => "", "secret" => ""), 
        "scope" => "email, user_about_me, user_birthday, user_hometown", 
        "trustForwarded" => false 
       ), 
       "Twitter" => array(
        "enabled" => true, 
        "keys" => array("key" => "", "secret" => "") 
       ), 
       // windows live 
       "Live" => array(
        "enabled" => true, 
        "keys" => array("id" => "", "secret" => "") 
       ), 
       "LinkedIn" => array(
        "enabled" => true, 
        "keys" => array("key" => "", "secret" => "") 
       ), 
       "Foursquare" => array(
        "enabled" => true, 
        "keys" => array("id" => "", "secret" => "") 
       ), 
      ), 
      // If you want to enable logging, set 'debug_mode' to true. 
      // You can also set it to 
      // - "error" To log only error messages. Useful in production 
      // - "info" To log info and error messages (ignore debug messages) 
      "debug_mode" => false, 
      // Path to file writable by the web server. Required if 'debug_mode' is not false 
      "debug_file" => "", 
); 

Шаг 3 : Теперь в вашем контроллере пользователей (я использовал пользовательский контроллер для http://localhost/your-app-folder/users/social - для моих нужд)

N ой контроллер должен выглядеть так,

<?php 

namespace App\Controller; 

use App\Controller\AppController; 

class UsersController extends AppController { 

    public function beforeFilter(\Cake\Event\Event $event) { 
     parent::beforeFilter($event); 
     $this->Auth->allow(['register','social', 'social_redirect']); 
    } 

    public function index() { 
     return $this->redirect(['controller' => 'Users', 'action' => 'add']); 
    } 

    public function social($provider) { 

    /* Include the Config File */ 
    require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'config.php'); 
    require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'Hybrid' . DS . 'Auth.php'); 

    /* Initiate Hybrid_Auth Function*/ 
    $hybridauth = new \Hybrid_Auth($config); 
    $authProvider = $hybridauth->authenticate($provider); 
    $user_profile = $authProvider->getUserProfile(); 

    /*Modify here as per you needs. This is for demo */ 
    if ($user_profile && isset($user_profile->identifier)) { 
     echo "<b>Name</b> :" . $user_profile->displayName . "<br>"; 
     echo "<b>Profile URL</b> :" . $user_profile->profileURL . "<br>"; 
     echo "<b>Image</b> :" . $user_profile->photoURL . "<br> "; 
     echo "<img src='" . $user_profile->photoURL . "'/><br>"; 
     echo "<b>Email</b> :" . $user_profile->email . "<br>"; 
     echo "<br> <a href='logout.php'>Logout</a>"; 
    } 
    exit; 

    /*Example Demo For FB authorize Action*/ 
    #Facebook authorize 
    if ($this->request->params['pass'][0] == 'Facebook') { 
     if ($user_profile && isset($user_profile->identifier)) { 
      $this->authorize_facebook($user_profile); 
     } 
    } 
} 

public function social_redirect() { 
    $this->layout = false; 
    $this->autoRender = false; 
    require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'config.php'); 
    require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'Hybrid' . DS . 'Auth.php'); 
    require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'Hybrid' . DS . 'Endpoint.php'); 
    $hybridauth = new \Hybrid_Auth($config); 
    \Hybrid_Endpoint::process(); 
} 


public function authorize_facebook($user_profile) { 

     $provider = "Facebook"; 
     $provider_uid = $user_profile->identifier; 

     $userExist = $this->Users->find('all')->where(['Users.provider' => $provider, 'Users.provider_uid' => $user_profile->identifier])->first(); 


     if ((isset($userExist)) && ($userExist)) { 

      $session = $this->request->session(); 
      $session->delete('auth_sess_var'); 
      $session->destroy(); 
      $this->Auth->setUser($userExist->toArray()); 
      $session->write('auth_sess_var', $userExist); 
      return $this->redirect($this->Auth->redirectUrl()); 
     } else { 

      /* Create new user entity */ 
      $user = $this->Users->newEntity(); 
      $tmp_hash = md5(rand(0, 1000)); 
      $tmp_id = time(); 

      /* Save individual data */ 
      $user->tmp_id = $tmp_id; 
      $user->firstname = (!empty($user_profile->firstName)) ? $user_profile->firstName : ""; 
      $user->lastname = (!empty($user_profile->lastName)) ? $user_profile->lastName : ""; 
      $user->username = (!empty($user_profile->lastName) && !empty($user_profile->lastName)) ? strtolower($user_profile->firstName) . "." . strtolower($user_profile->lastName) : ""; 
      $user->avatar = (!empty($user_profile->photoURL)) ? $user_profile->photoURL : ""; 
      $user->role = "public"; 
      $user->provider = $provider; 
      $user->provider_uid = $user_profile->identifier; 
      $user->gender = !empty($user_profile->gender) ? (($user_profile->gender == 'male') ? 'm' : 'f') : ""; 
      $user->provider_email = !empty($user_profile->email) ? $user_profile->email : ""; 
      $user->password = $user_profile->identifier; 
      $user->confirm_password = $user_profile->identifier; 
      $user->tmp_hash = $tmp_hash; 
      $user->isverified = (!empty($user_profile->emailVerified)) ? 1 : 0; 
      $user = $this->Users->patchEntity($user, $this->request->data); 
      $this->Users->save($user); 

      $userDetails = $this->Users->find('all')->where(['Users.provider' => $provider, 'Users.provider_uid' => $user_profile->identifier])->first(); 

      /* Destroy previous session before setting new Session */ 
      $session = $this->request->session(); 
      $session->delete('auth_sess_var'); 
      $session->destroy(); 

      /* Set user */ 
      $this->Auth->setUser($userDetails->toArray()); 
      $session->write('auth_sess_var', $userDetails); 
      return $this->redirect($this->Auth->redirectUrl()); 
     } 
    } 

} 

Примечание: Изменение вещей, в соответствии с вашими потребностями и разработать таблицу согласно вашему требованию.

Шаг 4

Вызов гибридную авторизацию:

For Ex: <a href="https://stackoverflow.com/users/social/Facebook">Facebook<a> 

для facebook входа в систему;

Eureka. Он будет работать как шарм.

Для получения дополнительной информации здесь.

Edit 2:

Пример Войти Действие (по умолчанию Auth Control)

В App Controller,

public function initialize() { 
     parent::initialize(); 
     $this->loadComponent('Flash'); 

     /* Authentication */ 
     $this->loadComponent('Auth', [ 
      'authenticate' => [ 
       'Form' => [ 
        'fields' => [ 
         'username' => 'email', 
         'password' => 'password' 
        ] 
       ] 
      ], 
      'loginRedirect' => [ 
       'controller' => 'controller', 
       'action' => 'action' 
      ], 
      'logoutRedirect' => [ 
       'controller' => 'Users', 
       'action' => 'login' 
      ], 
      'loginAction' => [ 
       'controller' => 'Users', 
       'action' => 'login' 
      ] 
     ]); 

    } 
+0

Благодарим за вашу поддержку. Но когда я загружаю компонент в AppController: $ this-> loadComponent ('Auth', [ 'подлинность' => [ 'Форма', 'ADmad/HybridAuth.HybridAuth' ] ]); Я получаю сообщение об ошибке: Адаптер аутентификации "ADmad/HybridAuth.HybridAuth" не найден. Не могли бы вы посоветовать мне, как его использовать? Many Thank –

+0

Используйте компонент auth по умолчанию для входа в систему. Проверьте, существует ли в базе данных письмо в базе данных, затем сохраняйте адрес электронной почты и идентификатор провайдера, а затем выполните проверку подлинности. –

+0

Примите мой ответ, если его работы .. –

1

Вы читали эту страницу? http://miftyisbored.com/complete-social-login-application-tutorial-cakephp-2-3-twitter-facebook-google/

Это поможет вам поставить hybridauth в CakePHP 3.0, но вам необходимо изменить некоторые моменты в CakePHP3 пути, как:

// config/hybridauth.php 

return [ 
    'HybridAuth' => [ 
    'base_url' => 'URL here', 
    'providers' => [ 
     'Twitter' => [...] 
    ] 
]; 

и

// src/Controller/Component/HybridauthComponent.php 

// App::import('Vendor', 'hybridauth/Hybrid/Auth'); 
// $this->hybridauth = new Hybrid_Auth($config); 
$this->hybridauth = new \Hybrid_Auth($config); 

Кроме того, проверить это документ.

https://github.com/ADmad/CakePHP-HybridAuth/blob/master/README.md

Он говорит, что вы должны инициализировать компонент Auth, но он не работает так, поэтому я ставлю эти варианты, как это:

// src/Controller/AppController.php 

public function initialize() 
{ 
    $this->loadComponent('Auth', [ 
    'authenticate' => [ 
     'ADmad/HybridAuth.HybridAuth' 
    ], 
    // redirect here if the user not authorized 
    'loginAction' => [ 
     'controller' => 'User', 
     'action' => 'login', 
    ], 
    ]); 
} 
0

я получил ошибку с этим кодом и я починил с: Ошибка: Конфигурация Hybriauth не существует на данном пути.

решение: в контроллере пользователей, где вы звоните (требуется) config.php

require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'config.php'); 

вам нужно сохранить то, что вам требуется в переменной $ конфигурации:

$config = require_once(ROOT . DS . 'vendor' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'hybridauth' . DS . 'config.php');