2016-12-08 2 views
1

фон

У меня странный вопрос с простой строки кода, которые я не понимаю. У меня есть действие на контроллере, которое я использую для авторизации LinkedIn. При первом обращении пользователя к контроллеру он перенаправляется на сайт LinkedIn для аутентификации, как только пользователь будет аутентифицироваться, связанный в перенаправлении обратно на тот же контроллер с кодом auth в URL-адресе в качестве параметра.

http://beta.consynki.com/authentication/network/linkedin?code=DQTdGfxIlbsU...

Контроллер

class AuthenticationController extends WebController { 

    public function actionNetwork($network){ 
     $access_token = Yii::$app->request->get('code'); 

     $network_connection  = NetworkFactory::build($network); 
     $client = $network_connection->getClient(); 

     if($access_token && !is_null($access_token)){ 

      $headers = Yii::$app->response->headers; 
      $headers->set('Pragma', 'no-cache'); 
      $headers->add('X-Access-Token', $access_token); 

      return $this->render('success'); 
     } 

     return $this->redirect($client->getLoginUrl(),302)->send(); 
    } 
} 

EDIT 1 - WebController

/** 
* Class WebController 
* 
* Default controller for public web pages. This class pulls meta tags from a seporately stored file, and makes 
* them available to the view. 
* 
* @package www\components 
*/ 
class WebController extends Controller { 

    public $meta = []; 

    public function beforeAction($event) { 

     $controller = $this->id; 
     $action  = $this->action->id; 
     $meta_file = Yii::getAlias('@www') . '/meta/' . $controller . '/' . $action . '.php'; 

     if (file_exists($meta_file)) { 
      $this->meta = include($meta_file); 
      $this->setMetaTags($this->meta); 
     } 

     return parent::beforeAction($event); 
    } 

    /** 
    * Set the meta tags for a page 
    * 
    * @param string $type 
    * @param  $tag 
    * @param  $value 
    */ 
    public function registerMetaTag($type = 'name', $tag, $value) { 

     if (!is_null($value)) { 
      $this->view->registerMetaTag([ 
       $type  => $tag, 
       'content' => $value 
      ]); 
     } 

    } 

    public function behaviors() { 
     return [ 

      /** 
      * The particular campaign used. 
      * 
      * Example social_share, stay_connected_add 
      */ 
      'utm_campaign' => [ 
       'class'  => 'common\behavior\TrackingBehavior', 
       'queryParam' => 'utm_campaign', 
       'sessionParam' => 'utm_campaign', 
      ], 

      /* 
      * The source of the referral, could be an add network, facebook, email or just a link on the Consynki site. 
      * 
      * example: google, facebook, citysearch, welcome_email 
      */ 
      'utm_source' => [ 
       'class'  => 'common\behavior\TrackingBehavior', 
       'queryParam' => 'utm_source', 
       'sessionParam' => 'utm_source', 
      ], 
     ]; 
    } 

    protected function setMetaTags($meta) { 
     foreach ($meta AS $key => $value) { 
      if (is_array($value)) { 
       $this->view->registerMetaTag($value, $key); 
      } 
     } 
    } 
} 

Проблема

Когда я пытаюсь получить code из параметра GET Yii::$app->request->get('code');, я получаю значение NULL. При дальнейшем проверке массива $ _GET var_dump($app->request->get() или var_dump($_GET); Я вижу ключ для переменной code, перед ним стоит $ "?code". Это очень странно.

array(3) { ["network"]=> string(8) "linkedin" ["?code"]=> string(115) "DQTdGfxIlbsU..." ["state"]=> string(32) "12121..." }

Research Notes

Похоже Yii2 изменить это значение $ _GET, как она проходит маршрутизацией URL. Не уверен, что это проблема. Обновилась до последней версии yii, и это не устранило проблему.

Вопрос

Почему это произошло? Как я могу исправить это, чтобы получить значение code?

+0

Вы уверены, что 'actionNetwork ($ network) {'? Или, 'actionLinkedin ($ network) {'? –

+1

Какое у вас правило UrlManager для этого URL? – Bizley

+0

Эй @nana & @bizley, его 'actionNetwork ($ network)', мое правило маршрутизации выглядит так: '' аутентификация/сеть/ '=>' authentication/network ', ' –

ответ

1

правила, установленные там, как это:

'authentication/network/<network:\w+>/<code:\w+>' => 'authentication/network', 
'authentication/network/<network:\w+>' => 'authentication/network', 

Теперь в действии набор параметров, как:

public function actionNetwork($network, $code = null) 

Ваш предыдущий $access_token теперь $code.

+0

Спасибо, это решение также добавляет $ перед кодовым ключом. –

+0

'$' или '?' Как вы создаете ссылку в первую очередь? – Bizley

+0

Извините '?' Not '$' ['? Code' => 'AbC ...']. Я предоставляю URL-адрес обратного вызова LinkedIn как часть запроса oAuth, LinkedIn добавляет параметр 'code' к URL-адресу обратного вызова, когда пользователь успешно аутентифицируется. Затем я могу получить код и использовать его для совершения аутентифицированных вызовов API в LinkedIn. –

 Смежные вопросы

  • Нет связанных вопросов^_^