Login using Instagram in PHP

In this tutorial I will explain you how to login using Instagram in PHP. I already published login with Facebook, Twitter and Google Plus now we will learn about very popular photo sharing portal Instagram. This post explains you how to login with Instagram API and store user data in database. First create an application on Instagram developer site fill out the details of your website and save the details

login using instagraam in codeigniter

we will use these details in the instagram.config.php file later on.


Next create a table in database

CREATE TABLE users
(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(70), 
name VARCHAR(100), 
instagram_id INT, 
instagram_access_token VARCHAR(200) 
);

Now create a folder name Instagram on localhost and create file name index.php and paste the below code

<!DOCTYPE html>
<html lang="en">
 
  <body>
<h1>Login with Instragram</h1>
OAuth using PHP 
<a href='http://www.w3code.in'>w3code.in</a>
    <?php
session_start();
if (!empty($_SESSION['userdetails'])) 
{
	header('Location: home.php');
}
      require 'instagram.class.php';
      require 'instagram.config.php';
 
      // Display the login button
      $loginUrl = $instagram->getLoginUrl();
      echo "<a class=\"button\" href=\"$loginUrl\">Sign in with Instagram</a>";
    ?>
 
  </body>
</html>

Now create a another file name instagram.class.php and paste the below code

<?php
class Instagram {
 
  /**
   * The API base URL
   */
  const API_URL = 'https://api.instagram.com/v1/';
 
  /**
   * The API OAuth URL
   */
  const API_OAUTH_URL = 'https://api.instagram.com/oauth/authorize';
 
  /**
   * The OAuth token URL
   */
  const API_OAUTH_TOKEN_URL = 'https://api.instagram.com/oauth/access_token';
 
  /**
   * The Instagram API Key
   * 
   * @var string
   */
  private $_apikey;
 
  /**
   * The Instagram OAuth API secret
   * 
   * @var string
   */
  private $_apisecret;
 
  /**
   * The callback URL
   * 
   * @var string
   */
  private $_callbackurl;
 
  /**
   * The user access token
   * 
   * @var string
   */
  private $_accesstoken;
 
  /**
   * Available scopes
   * 
   * @var array
   */
  private $_scopes = array('basic', 'likes', 'comments', 'relationships');
 
 
  /**
   * Default constructor
   *
   * @param array|string $config          Instagram configuration data
   * @return void
   */
  public function __construct($config) {
    if (true === is_array($config)) {
      // if you want to access user data
      $this->setApiKey($config['apiKey']);
      $this->setApiSecret($config['apiSecret']);
      $this->setApiCallback($config['apiCallback']);
    } else if (true === is_string($config)) {
      // if you only want to access public data
      $this->setApiKey($config);
    } else {
      throw new Exception("Error: __construct() - Configuration data is missing.");
    }
  }
 
  /**
   * Generates the OAuth login URL
   *
   * @param array [optional] $scope       Requesting additional permissions
   * @return string                       Instagram OAuth login URL
   */
  public function getLoginUrl($scope = array('basic')) {
    if (is_array($scope) && count(array_intersect($scope, $this->_scopes)) === count($scope)) {
      return self::API_OAUTH_URL.'?client_id='.$this->getApiKey().'&redirect_uri='.$this->getApiCallback().'&scope='.implode('+', $scope).'&response_type=code';
    } else {
      throw new Exeption("Error: getLoginUrl() - The parameter isn't an array or invalid scope permissions used.");
    }
  }
 
  /**
   * Search for a user
   *
   * @param string $name                  Instagram username
   * @param integer [optional] $limit     Limit of returned results
   * @return mixed
   */
  public function searchUser($name, $limit = 0) {
    return $this->_makeCall('users/search', false, array('q' => $name, 'count' => $limit));
  }
 
  /**
   * Get user info
   *
   * @param integer [optional] $id        Instagram user id
   * @return mixed
   */
  public function getUser($id = 0) {
    $auth = false;
    if ($id === 0 && isset($this->_accesstoken)) { $id = 'self'; $auth = true; }
    return $this->_makeCall('users/'.$id, $auth);
  }
 
  /**
   * Get user activity feed
   *
   * @param integer [optional] $limit     Limit of returned results
   * @return mixed
   */
  public function getUserFeed($limit = 0) {
    return $this->_makeCall('users/self/feed', true, array('count' => $limit));
  }
 
  /**
   * Get user recent media
   *
   * @param integer [optional] $id        Instagram user id
   * @param integer [optional] $limit     Limit of returned results
   * @return mixed
   */
  public function getUserMedia($id = 'self', $limit = 0) {
    return $this->_makeCall('users/'.$id.'/media/recent', true, array('count' => $limit));
  }
 
  /**
   * Get the liked photos of a user
   *
   * @param integer [optional] $limit     Limit of returned results
   * @return mixed
   */
  public function getUserLikes($limit = 0) {
    return $this->_makeCall('users/self/media/liked', true, array('count' => $limit));
  }
 
  /**
   * Search media by its location
   *
   * @param string $lat                   Latitude of the center search coordinate
   * @param string $lng                   Longitude of the center search coordinate
   * @return mixed
   */
  public function searchMedia($lat, $lng) {
    return $this->_makeCall('media/search', false, array('lat' => $lat, 'lng' => $lng));
  }
 
  /**
   * Get media by its id
   *
   * @param integer $id                   Instagram media id
   * @return mixed
   */
  public function getMedia($id) {
    return $this->_makeCall('media/'.$id);
  }
 
  /**
   * Get the most popular media
   *
   * @return mixed
   */
  public function getPopularMedia() {
    return $this->_makeCall('media/popular');
  }
 
  /**
   * Search for tags by name
   *
   * @param string $name                  Valid tag name
   * @return mixed
   */
  public function searchTags($name) {
    return $this->_makeCall('tags/search', false, array('q' => $name));
  }
 
  /**
   * Get info about a tag
   *
   * @param string $name                  Valid tag name
   * @return mixed
   */
  public function getTag($name) {
    return $this->_makeCall('tags/'.$name);
  }
 
  /**
   * Get a recently tagged media
   *
   * @param string $name                  Valid tag name
   * @return mixed
   */
  public function getTagMedia($name) {
    return $this->_makeCall('tags/'.$name.'/media/recent');
  }
 
  /**
   * Get the OAuth data of a user by the returned callback code
   *
   * @param string $code                  OAuth2 code variable (after a successful login)
   * @param boolean [optional] $token     If it's true, only the access token will be returned
   * @return mixed
   */
  public function getOAuthToken($code, $token = false) {
    $apiData = array(
      'grant_type'      => 'authorization_code',
      'client_id'       => $this->getApiKey(),
      'client_secret'   => $this->getApiSecret(),
      'redirect_uri'    => $this->getApiCallback(),
      'code'            => $code
    );
 
    $result = $this->_makeOAuthCall($apiData);
    return (false === $token) ? $result : $result->access_token;
  }
 
  /**
   * The call operator
   *
   * @param string $function              API resource path
   * @param array [optional] $params      Additional request parameters
   * @param boolean [optional] $auth      Whether the function requires an access token
   * @return mixed
   */
  private function _makeCall($function, $auth = false, $params = null) {
    if (false === $auth) {
      // if the call doesn't requires authentication
      $authMethod = '?client_id='.$this->getApiKey();
    } else {
      // if the call needs a authenticated user
      if (true === isset($this->_accesstoken)) {
        $authMethod = '?access_token='.$this->getAccessToken();
      } else {
        throw new Exeption("Error: _makeCall() | $function - This method requires an authenticated users access token.");
      }
    }
 
    if (isset($params) && is_array($params)) {
      $params = '&'.http_build_query($params);
    } else {
      $params = null;
    }
 
    $apiCall = self::API_URL.$function.$authMethod.$params;
 
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiCall);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
 
    $jsonData = curl_exec($ch);
    curl_close($ch);
 
    return json_decode($jsonData);
  }
 
  /**
   * The OAuth call operator
   *
   * @param array $apiData                The post API data
   * @return mixed
   */
  private function _makeOAuthCall($apiData) {
    $apiHost = self::API_OAUTH_TOKEN_URL;
 
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiHost);
    curl_setopt($ch, CURLOPT_POST, count($apiData));
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($apiData));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 
    $jsonData = curl_exec($ch);
    curl_close($ch);
 
    return json_decode($jsonData);
  }
 
  /**
   * Access Token Setter
   * 
   * @param object|string $data
   * @return void
   */
  public function setAccessToken($data) {
    (true === is_object($data)) ? $token = $data->access_token : $token = $data;
    $this->_accesstoken = $token;
  }
 
  /**
   * Access Token Getter
   * 
   * @return string
   */
  public function getAccessToken() {
    return $this->_accesstoken;
  }
 
  /**
   * API-key Setter
   * 
   * @param string $apiKey
   * @return void
   */
  public function setApiKey($apiKey) {
    $this->_apikey = $apiKey;
  }
 
  /**
   * API Key Getter
   * 
   * @return string
   */
  public function getApiKey() {
    return $this->_apikey;
  }
 
  /**
   * API Secret Setter
   * 
   * @param string $apiSecret 
   * @return void
   */
  public function setApiSecret($apiSecret) {
    $this->_apisecret = $apiSecret;
  }
 
  /**
   * API Secret Getter
   * 
   * @return string
   */
  public function getApiSecret() {
    return $this->_apisecret;
  }
 
  /**
   * API Callback URL Setter
   * 
   * @param string $apiCallback
   * @return void
   */
  public function setApiCallback($apiCallback) {
    $this->_callbackurl = $apiCallback;
  }
 
  /**
   * API Callback URL Getter
   * 
   * @return string
   */
  public function getApiCallback() {
    return $this->_callbackurl;
  }
 
}
 
?>

Create another file name instagram.config.php file and paste the below code. We will use this file to fill out the API we have created on the Instagram app.

<?php
// Setup class
  $instagram = new Instagram(array(
    'apiKey'      => 'Client_ID',
    'apiSecret'   => 'Client_Secret',
    'apiCallback' => 'http://www.yoursite.com/success.php' 
  ));
 
?>

Now create a file name success.php inside and paste the below code. We will insert the data in database once user get logged in.

<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'username');
define('DB_PASSWORD', 'password');
define('DB_DATABASE', 'database');
$connection = mysql_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD) or die(mysql_error());
$database = mysql_select_db(DB_DATABASE) or die(mysql_error());
 
require 'instagram.class.php';
require 'instagram.config.php';
 
// Receive OAuth code parameter
$code = $_GET['code'];
 
 
 
// Check whether the user has granted access
if (true === isset($code)) {
 
  // Receive OAuth token object
  $data = $instagram->getOAuthToken($code);
  // Take a look at the API response
 
if(empty($data->user->username))
{
header('Location: index.php');
 
}
else
{
	session_start();
	$_SESSION['userdetails']=$data;
	$user=$data->user->username;
	$fullname=$data->user->full_name;
	$id=$data->user->id;
	$token=$data->access_token;
 
$id=mysql_query("select instagram_id from users where instagram_id='$id'");
 
if(mysql_num_rows($id) == 0)
{	
mysql_query("insert into users(username,Name,instagram_id,instagram_access_token) values('$user','$fullname','$id','$token')");
}
 
echo '<pre>';
	   print_r($data);
	   echo '<pre>';
}
} 
else 
{
// Check whether an error occurred
if (true === isset($_GET['error'])) 
{
    echo 'An error occurred: '.$_GET['error_description'];
}
 
}
 
?>

Now run the URL http://localhost/instagram and you can enjoy login using Instagram in your  website.

Hope this article how to login using Instagram in PHP will help you

 

  • KAshyap PTel

    Code is working but when i do logn then everytime it return black status while authecation api call for code authentication
    can please help me