{{ROOT_URL}}/access_token?client_secret={{APP_SECRET}}&access_token={{ACCESS_TOKEN}}&grant_type=ig_exchange_token
private function _setUserInstagramAccessToken( $params ) {
if ( $params['access_token'] ) { // we have an access token
$this->_userAccessToken = $params['access_token'];
$this->hasUserAccessToken = true;
$this->userId = $params['user_id'];
} elseif ( $params['get_code'] ) { // try and get an access token
$userAccessTokenResponse = $this->_getUserAccessToken();
$this->_userAccessToken = $userAccessTokenResponse['access_token'];
$this->hasUserAccessToken = true;
$this->userId = $userAccessTokenResponse['user_id'];
// get long lived access token
$longLivedAccessTokenResponse = $this->_getLongLivedUserAccessToken();
$this->_userAccessToken = $longLivedAccessTokenResponse['access_token'];
$this->_userAccessTokenExpires = $longLivedAccessTokenResponse['expires_in'];
}
}
private function _getUserAccessToken() {
$params = array(
'endpoint_url' => $this->_apiBaseUrl . 'oauth/access_token',
'type' => 'POST',
'url_params' => array(
'app_id' => $this->_appId,
'app_secret' => $this->_appSecret,
'grant_type' => 'authorization_code',
'redirect_uri' => $this->_redirectUrl,
'code' => $this->_getCode
)
);
$response = $this->_makeApiCall( $params );
return $response;
}
private function _getLongLivedUserAccessToken() {
$params = array(
'endpoint_url' => $this->_graphBaseUrl . 'access_token',
'type' => 'GET',
'url_params' => array(
'client_secret' => $this->_appSecret,
'grant_type' => 'ig_exchange_token',
)
);
$response = $this->_makeApiCall( $params );
return $response;
}
// This will redirect the user on successful login, or return false if not
$loginController->login($provider);
if ($provider == 'instagram')
{
// Fetch long-lived token here
$provider->client->setToken($longLivedToken);
}
// This will redirect the user on successful login, or return false if not
$loginController->login($provider);
'endpoint_url' => $this->_graphBaseUrl . 'access_token','type' => 'GET',
'client_secret' => $this->_appSecret,
'grant_type' => 'ig_exchange_token',
public function authenticate()
{
if ($data['code'] = $this->input->get('code', false, 'raw'))
{
$data['grant_type'] = 'authorization_code';
$data['redirect_uri'] = $this->getOption('redirecturi');
$data[$this->clientIdField] = $this->getOption('clientid');
$data[$this->clientSecretField] = $this->getOption('clientsecret');
$response = $this->http->post($this->getOption('tokenurl'), $data);
if ($response->code >= 200 && $response->code < 400)
{
if ((strpos($response->headers['Content-Type'], 'application/json') !== false ) ||
(strpos($response->headers['content-type'], 'application/json') !== false ))
{
$token = array_merge(json_decode($response->body, true), array('created' => time()));
}
else
{
parse_str($response->body, $token);
$token = array_merge($token, array('created' => time()));
}
$this->setToken($token);
return $token;
}
else
{
throw new RuntimeException('Error code ' . $response->code . ' received requesting access token: ' . $response->body . '.');
}
}
if ($this->getOption('sendheaders'))
{
$app = JFactory::getApplication();
$app->setUserState('com_jfbconnect.authentication.started.' . $this->provider->systemName, true);
$this->application->redirect($this->createUrl());
}
return false;
}
function setupAuthentication()
{
$options = new JRegistry();
$options->set('authurl', 'https://api.instagram.com/oauth/authorize');
$options->set('tokenurl', 'https://api.instagram.com/oauth/access_token');
$options->set('authmethod', 'get');
$headers = array();
$headers['Content-Type'] = 'application/json';
$options->set('headers', $headers);
$options->set('scope', implode(',', $this->profile->getRequiredScope()));
$this->client = new JFBConnectAuthenticationOauth2($options);
if (JFBCFactory::config()->get('instagram_new_api_enabled'))
$this->client->setClientFields('app_id', 'app_secret');
$token = JFactory::getApplication()->getUserState('com_jfbconnect.' . $this->systemName . '.token', null);
if ($token)
{
$token = (array)json_decode($token);
$this->client->setToken($token);
}
$this->client->initialize($this);
if (JFBCFactory::config()->get('instagram_new_api_enabled'))
{
$redirect = JUri::base() . 'index.php';
}
else //deprecated by instagram, remove 03/2020
{
$redirect = $this->client->getOption('redirecturi');
}
$redirect = str_replace('http://', 'https://', $redirect);
$this->client->setOption('redirecturi', $redirect);
}
// Fetch long-lived token here
$provider->client->setToken($longLivedToken);
private function doLogin($provider)
{
if ($provider->client->isAuthenticated())
{
$provider->setSessionToken();
require_once(JPATH_COMPONENT . '/controllers/login.php');
$loginController = new JFBConnectControllerLogin();
// Set the users.login.form.redirect for the LanguageFilter plugin or anything else that expects it
// Doesn't really matter where it goes as we redirect separately later, but this helps ensure compatibility with extensions
// that are expected it to be set
$lang = substr(JFactory::getLanguage()->getDefault(), 0, 2);
$url = rtrim(Juri::base(), '/') . JRoute::_('index.php?lang=' . $lang);
JFactory::getApplication()->setUserState('users.login.form.return', $url);
if ($provider == 'instagram')
{
// Fetch long-lived token here
$data['grant_type'] = 'ig_exchange_token';
$data['access_token'] = $this->token;
$data[$this->clientSecretField] = $this->getOption('clientsecret');
$response = $this->http->get($this->getOption('https://graph.instagram.com/access_token?'), $data);
if ($response->code >= 200 || $response->code < 400)
{
if (strpos($response->headers['Content-Type'], 'application/json') !== false)
{
$longLivedToken = array_merge(json_decode($response->body, true), array('created' => time()));
}
else
{
parse_str($response->body, $longLivedToken);
$longLivedToken = array_merge($longLivedToken, array('created' => time()));
}
$this->setToken($longLivedToken);
return $longLivedToken;
}
else
{
throw new Exception('Error code ' . $response->code . ' received long-lived token: ' . $response->body . '.');
}
$provider->client->setToken($longLivedToken);
}
// This will redirect the user on successful login, or return false if not
$loginController->login($provider);
}
// If we get here, something failed
$this->redirectOnFailedAuth();
}
if ($provider->systemName == 'instagram')
{
// Fetch long-lived token here
$data['grant_type'] = 'ig_exchange_token';
$data['access_token'] = $provider->client->getToken();
$data[$this->clientSecretField] = $provider->secretKey;
$response = $this->http->get($this->getOption('https://graph.instagram.com/access_token?'), $data);
if ($response->code >= 200 || $response->code < 400)
{
if (strpos($response->headers['Content-Type'], 'application/json') !== false)
{
$longLivedToken = array_merge(json_decode($response->body, true), array('created' => time()));
}
else
{
parse_str($response->body, $longLivedToken);
$longLivedToken = array_merge($longLivedToken, array('created' => time()));
}
$this->setToken($longLivedToken);
}
else
{
throw new Exception('Error code ' . $response->code . ' received long-lived token: ' . $response->body . '.');
}
$provider->client->setToken($longLivedToken);
}
$data['grant_type'] = 'ig_exchange_token';
$data['access_token'] = $provider->client->getToken();
$data[$this->clientSecretField] = $provider->secretKey;
$response = $this->http->get($this->getOption('https://graph.instagram.com/access_token?'), $data);
$response = $provider->client->http->get('https://graph.instagram.com/access_token?grant_type=ig_exchange_token&client_secret=' . $provider->secretKey . 'access_token=' . $provider->client->getToken());
Join our newsletter to get alerts for Joomla releases, tips and tricks and extension updates.