public function beginSession($callback, array $scope = [])
    {
        $requestUrl = $this->config['request_url'];

        if (0 < count($scope)) {
            $requestUrl .= ((false === strpos($requestUrl, '?')) ? '?' : '&') . 'scope=' . rawurlencode(implode(' ', $scope));
        }

        $response = $this->sendCustomOauthPostRequest(
            $requestUrl,
            [
                'callback' => $callback,
                'token' => null,
                'token_secret' => null,
            ]
        );

        parse_str($response->getBody(), $responseData);

        if (!isset($responseData['oauth_callback_confirmed'])) {
            throw new UnexpectedValueException('Oauth exchange is missing `oauth_callback_confirmed`.');
        } elseif (!isset($responseData['oauth_token'])) {
            throw new UnexpectedValueException('Oauth exchange is missing `oauth_token`.');
        } elseif (!isset($responseData['oauth_token_secret'])) {
            throw new UnexpectedValueException('Oauth exchange is missing `oauth_token_secret`.');
        }

        if ('true' !== $responseData['oauth_callback_confirmed']) {
            throw new UnexpectedValueException('Oauth exchange must have `oauth_callback_confirmed` as `true`.');
        }

        $this->authentication->getTokenStorage()->setRequestToken($responseData['oauth_token']);
        $this->authentication->getTokenStorage()->setRequestTokenSecret($responseData['oauth_token_secret']);

        $redirect = $this->config['authorize_url'];
        $redirect .= ((false === strpos($redirect, '?')) ? '?' : '&') . 'oauth_token=' . rawurlencode($this->authentication->getTokenStorage()->getRequestToken());

        return $redirect;
    }