Levi Putna
Levi Putna

Reputation: 3073

Yii2 $_GET and Yii::$app->request->get() not working

Background

I'm having an odd issue with a simple line of code that I don't understand. I have an Action on a Controller that i'm using for LinkedIn auth. The first time the user hits the controller it redirects to the LinkedIn site for authentication, once the user authenticates linked in redirects back to the same controller with the auth code in the url as a param.

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

Controller

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

Problem

When I try to get the code from the GET param Yii::$app->request->get('code'); I get a NULL value. On further inspection of the $_GET array var_dump($app->request->get() or var_dump($_GET); I see the key for the code variable has a $ "?code" in front of it. This is very odd.

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

Research Notes

It looks like Yii2 modify's the $_GET value as it passes the url routing. Not sure if this is the issue. Have updated to the latest version of yii and it didn't fix the problem.

Question

Why would this happen? How can I fix it so that I can get the code value?

Upvotes: 1

Views: 6073

Answers (1)

Bizley
Bizley

Reputation: 18021

Set rules there like this:

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

Now in action set parameters like:

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

Your previous $access_token is now $code.

Upvotes: 1

Related Questions