The Instagram API gives you an easy way to a unified user authentication system in the web application. Therefore, log in with Instagram permits the user to authenticate with their Instagram account and log into the website. Since the Instagram API controls the authentication process, the web application does not require the user’s registration functionality. Instagram login provides quick access to the user without making an account on the site.
The Instagram API uses OAuth 2.0 to authorize the user. As a result, you can quickly implement the Login system with Instagram using the Instagram API and PHP. Therefore, In this tutorial, we will explain to you how to integrate Login with Instagram using PHP. CURL is a dominant and straightforward way to reach the Instagram API with PHP. So, we will use cURL to integrate the Instagram API in PHP. Moreover, we will implement the following functionality in the example Instagram OAuth script.
- Authenticate with an Instagram account using access_token.
- Retrieve the user’s profile data from an Instagram account.
- The profile information will be stored in the database using PHP and MySQL.
- Show the user’s account information.
Before proceeding to integrate Instagram Login in PHP, So, let’s have a look at the file structure.
instagram_login_with_php/ ├── config.php ├── index.php ├── logout.php ├── User.class.php ├── InstagramAuth.class.php ├── images/ └── css/
Register Instagram Client ID
Client ID and Client Secret are needed to access the Instagram API. Before you begin to implement Instagram login with PHP on the website, follow the steps below to register a new Instagram client and obtain the client ID and incognito.
- Firstly, go to the Instagram Developer Panel.
- Secondly, register and log in to your developer account.

- Thirdly, go to the Manage Clients page, and click on Register a New Client button.
- Now, give the Application info and click the Register to submit.
- You must match the Valid redirect URIs must with the redirect URL specified at the time of API request.
- After creating the App, it will be listed in the Manage Clients page. Click the MANAGE button

Now, you will see the Client ID and Client Secret in the App Details page. Note: These API credentials (client secret and client ID) will be for later use in a script.
Create Database Table
You need a table in the database to store the user’s profile information from Instagram. The following SQL creates a user table with some necessary fields in the MySQL database.
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `oauth_provider` enum('instagram','facebook','google','linkedin','') COLLATE utf8_unicode_ci NOT NULL, `oauth_uid` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `first_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `last_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `email` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `username` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `gender` varchar(5) COLLATE utf8_unicode_ci NOT NULL, `picture` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `link` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Instagram OAuth Library
The InstagramoAuth class helps to authorize with the Instagram API using PHP.
- getAccessToken() – Retrieve access_token from Instagram OAuth API (OAuth/access_token) using PHP cURL.
- getUserProfileInfo() – Fetch the user’s profile data from Instagram User API (users/self) by access_token.
<?php /* * Instagram API Class * This class helps to authenticate with Instagram API * @author CodexWorld.com * @url http://www.codexworld.com * @license http://www.codexworld.com/license */ class InstagramAuth { public $client_id = ''; public $client_secret = ''; public $redirect_url = ''; private $act_url = 'https://api.instagram.com/oauth/access_token'; private $ud_url = 'https://api.instagram.com/v1/users/self/'; public function __construct(array $config = array()){ $this->initialize($config); } public function initialize(array $config = array()){ foreach ($config as $key => $val){ if (isset($this->$key)){ $this->$key = $val; } } return $this; } public function getAuthURL(){ $authURL = "https://api.instagram.com/oauth/authorize/?client_id=" . $this->client_id . "&redirect_uri=" . urlencode($this->redirect_url) . "&response_type=code&scope=basic"; return $authURL; } public function getAccessToken($code) { $urlPost = 'client_id='. $this->client_id . '&client_secret=' . $this->client_secret . '&redirect_uri=' . $this->redirect_url . '&code='. $code . '&grant_type=authorization_code'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $this->act_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_POSTFIELDS, $urlPost); $data = json_decode(curl_exec($ch), true); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if($http_code != '200'){ throw new Exception('Error : Failed to receive access token'.$http_code); } return $data['access_token']; } public function getUserProfileInfo($access_token) { $url = $this->ud_url.'?access_token=' . $access_token; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); $data = json_decode(curl_exec($ch), true); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if($data['meta']['code'] != 200 || $http_code != 200){ throw new Exception('Error : Failed to get user information'); } return $data['data']; } }
User Class (User.class.php)
The User class handles the database operations (insert, connect, and update) using MySQL and PHP.
- __construct() – Connect to the MySQL database.
- checkUser() – Enter or update user account data (Instagram profile information) based on OAuth provider and ID. Returns the data of the user’s account as an array.
<?php /* * User Class * This class is used for database related (connect, insert, and update) operations * @author CodexWorld.com * @url http://www.codexworld.com * @license http://www.codexworld.com/license */ class User { private $dbHost = DB_HOST; private $dbUsername = DB_USERNAME; private $dbPassword = DB_PASSWORD; private $dbName = DB_NAME; private $userTbl = DB_USER_TBL; function __construct(){ if(!isset($this->db)){ // Connect to the database $conn = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName); if($conn->connect_error){ die("Failed to connect with MySQL: " . $conn->connect_error); }else{ $this->db = $conn; } } } function checkUser($userData = array()){ if(!empty($userData)){ // Check whether user data already exists in database $prevQuery = "SELECT * FROM ".$this->userTbl." WHERE oauth_provider = '".$userData['oauth_provider']."' AND oauth_uid = '".$userData['oauth_uid']."'"; $prevResult = $this->db->query($prevQuery); if($prevResult->num_rows > 0){ // Update user data if already exists $query = "UPDATE ".$this->userTbl." SET first_name = '".$userData['first_name']."', last_name = '".$userData['last_name']."', email = '".$userData['email']."', gender = '".$userData['gender']."', picture = '".$userData['picture']."', link = '".$userData['link']."', modified = NOW() WHERE oauth_provider = '".$userData['oauth_provider']."' AND oauth_uid = '".$userData['oauth_uid']."'"; $update = $this->db->query($query); }else{ // Insert user data $query = "INSERT INTO ".$this->userTbl." SET oauth_provider = '".$userData['oauth_provider']."', oauth_uid = '".$userData['oauth_uid']."', first_name = '".$userData['first_name']."', last_name = '".$userData['last_name']."', email = '".$userData['email']."', gender = '".$userData['gender']."', picture = '".$userData['picture']."', link = '".$userData['link']."', created = NOW(), modified = NOW()"; $insert = $this->db->query($query); } // Get user data from the database $result = $this->db->query($prevQuery); $userData = $result->fetch_assoc(); } // Return user data return $userData; } }
Site Settings and API Configuration (config.php)
Define the database settings and Instagram API configuration constant variables in the config.php file.
Database Constants:
- DB_HOST – Specify the database host.
- DB_USERNAME – Specify the database username.
- DB_PASSWORD – Specify the database password.
- DB_NAME – Specify the database name.
- DB_USER_TBL – Specify the table name where you’ll store the the user’s account data.
Instagram API Constants:
- INSTAGRAM_CLIENT_ID – Specify the Instagram Client ID.
- INSTAGRAM_CLIENT_SECRET – Specify the Instagram Client Secret.
- INSTAGRAM_REDIRECT_URI – Specify the Callback URL.
Initiate Instagram Auth class:
The Instagram auth library is used to work with the Instagram API and the OAuth client.
<?php /* * Basic Site Settings and API Configuration */ // Database configuration define('DB_HOST', 'MySQL_Database_Host'); define('DB_USERNAME', 'MySQL_Database_Username'); define('DB_PASSWORD', 'MySQL_Database_Password'); define('DB_NAME', 'MySQL_Database_Name'); define('DB_USER_TBL', 'users'); // Instagram API configuration define('INSTAGRAM_CLIENT_ID', 'Instagram_Client_Id'); define('INSTAGRAM_CLIENT_SECRET', 'Instagram_Client_Secret'); define('INSTAGRAM_REDIRECT_URI', 'Callback_URL'); // Start session if(!session_id()){ session_start(); } /* * For the internal purposes only * changes not required */ // Include Instagram OAuth library require_once 'InstagramAuth.class.php'; // Initiate Instagram Auth class $instagram = new InstagramAuth(array( 'client_id' => INSTAGRAM_CLIENT_ID, 'client_secret' => INSTAGRAM_CLIENT_SECRET, 'redirect_url' => INSTAGRAM_REDIRECT_URI ));
Note: You’ll see the Client ID and Client Secret on your Instagram Client settings page.
Login with Instagram and Get Account Data (index.php)
Handle the Instagram API authentication process using PHP.
- Firstly, generate the authentication URL using the getAuthURL() method of Instagram Auth class, and the Instagram Sign-in button is shown on the web page.
- Secondly, if the user authenticates with their Instagram account, the following things happen:
- The access_token is retrieved using getAccessToken() by the code which we have received during the authorization step.
- Retrieve the profile data from the Instagram account using getUserProfileInfo() by the access_token.
- So, by using the checkUser() function of User class your account data will be inserted into the database
- Store the user’s account data in the PHP SESSION.
- You have to show the Instagram profile details (ID, Last name, First name, Picture, and Profile link) on the webpage.
<?php // Include configuration file require_once 'config.php'; // Include User class require_once 'User.class.php'; // If URL contains 'code' parameter that passed by Instagram in the Redirect URL if(isset($_GET['code'])){ try { // Get the access token $access_token = $instagram->getAccessToken($_GET['code']); // Get user profile info $userData = $instagram->getUserProfileInfo($access_token); } catch (Exception $e) { $authErr = $e->getMessage(); } if(!empty($userData)){ $username = $userData['username']; $full_name = $userData['full_name']; $full_name_arr = explode(' ',$full_name); $first_name = !empty($full_name_arr[0])?$full_name_arr[0]:''; $last_name = !empty($full_name_arr[1])?$full_name_arr[1]:''; $link = 'https://www.instagram.com/'.$username; // Initialize User class $user = new User(); // Getting user's profile data $intUserData = array(); $intUserData['oauth_uid'] = $userData['id']; $intUserData['username'] = $username; $intUserData['first_name'] = $first_name; $intUserData['last_name'] = $last_name; $intUserData['picture'] = !empty($userData['profile_picture'])?$userData['profile_picture']:''; $intUserData['link'] = $link; $intUserData['email'] = ''; $intUserData['gender'] = ''; // Insert or update user data to the database $intUserData['oauth_provider'] = 'instagram'; $userData = $user->checkUser($intUserData); // Storing user data in the session $_SESSION['userData'] = $userData; // Get logout url $logoutURL = INSTAGRAM_REDIRECT_URI.'logout.php'; // Render Instagram profile data $output = '<h2>Instagram Profile Details</h2>'; $output .= '<div class="ac-data">'; $output .= '<img src="'.$userData['picture'].'"/>'; $output .= '<p><b>Account ID:</b> '.$userData['oauth_uid'].'</p>'; $output .= '<p><b>Name:</b> '.$userData['first_name'].' '.$userData['last_name'].'</p>'; $output .= '<p><b>Logged in with:</b> Instagram</p>'; $output .= '<p><b>Profile Link:</b> <a href="'.$userData['link'].'" target="_blank">Click to visit Instagram page</a></p>'; $output .= '<p><b>Logout from <a href="'.$logoutURL.'">Instagram</a></p>'; $output .= '</div>'; }else{ $output = '<h3 style="color:red">Instagram authentication has failed!</h3>'; if(!empty($authErr)){ $output = '<p style="color:red">'.$authErr.'</p>'; } } }else{ // Get login url $authURL = $instagram->getAuthURL(); // Render Instagram login button $output = '<a href="'.htmlspecialchars($authURL).'" class="instagram-btn"><span class="btn-icon"></span><span class="btn-text">Login with Instagram</span></a>'; } ?> <!DOCTYPE html> <html lang="en"> <head> <title>Login with Instagram using PHP by CodexWorld</title> <meta charset="utf-8"> <link rel="stylesheet" href="css/style.css"> </head> <body> <div class="container"> <div class="inst-box"> <!-- Display login button / Instagram profile information --> <?php echo $output; ?> </div> </div> </body> </html>
Logout (logout.php)
You have to load logout.php file if the user wants to log out from their Instagram account.
- Firstly, remove access token and user data from the SESSION.
- After that, redirect the user to the homepage.
<?php // Remove user data from session unset($_SESSION['userData']); // Redirect to the homepage header("Location:index.php"); ?>
Conclusion
Firstly, our Instagram Authentic Library helps you to integrate Instagram login with PHP. Secondly, our example code simplifies the Instagram API integration process with PHP cURL. Therefore, You can quickly implement Instagram login on a website with some minimum API settings.
Also, read our previous blog- Login with LinkedIn using JavaScript SDK
not working in 2021