Login with Instagram using PHP allows quickly login without creating an account on the website. It saves the extra hassle and time of your website user.
Instagram API allows to authenticate user information directly through Instagram in the web application. Further, in this tutorial, we will learn how to login with Instagram using PHP. Client URL(cURL) is used to integrate Instagram API in PHP.
So, the following steps should be followed to enable login with Instagram using PHP.
You need to put the below functionality in the example Instagram OAuth script.
- Authenticate your Instagram account using access_token
- Fetch the user profile data from Instagram account
- Store these data files in the database using languages like PHP and MySQL
- Publish the user account information
This is how the file structure will be:
instagram_login_with_php/ ├── config.php ├── index.php ├── logout.php ├── User.class.php ├── InstagramAuth.class.php ├── images/ └── css/
Registering the Instagram Client ID
Furthermore, you need to register an Instagram account to generate the client ID and client Secret.
To begin with:
- Open Instagram Development Panel
- Register & login to your new developer account
- Click on the ‘Manage Clients’ button and select ‘Register a New Client’ tab
- Fill in the requisite information and submit the form
- Also, the valid redirect URIs should match with the redirect URL specified at the time of Instagram API request.
- Once the app is created, it will automatically get listed in the Manage Clients section.
Further, in the App details section, you will find the Client ID and Client Secret. Make sure that you note these details to use in the script later on. This was the first step to login with Instagram using PHP.
Creating Database Table
A table is necessary to save the user’s profile information from Instagram. After that, you can use the following SQL query to create a users table with some basic fields.
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
Using this, you can integrate & authenticate the Instagram API using PHP.
- getAccessToken() – Get access_token from Instagram OAuth API (oauth/access_token) through PHP cURL.
- getUserProfileInfo() – Collect the user profile data from Instagram user API (users/self) by access_token.
<?php
/*
* Instagram API Class
* This class helps to authenticate with Instagram API
* @author Phpsof.com
* @url http://www.Phpsof.com
* @license http://www.Phpsof.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)
It handles connect, insert, and update operations using PHP and MySQL. And, these are database related operations. So, this is the next step to login with Instagram using PHP.
- _construct() – connect to the MySQL database
- checkUser() – Insert & update Instagram profile info based on the OAuth provider and ID. It returns the user’s profile data as an array.
<?php
/*
* User Class
* This class is used for database related (connect, insert, and update) operations
* @author Phpsof.com
* @url http://www.Phpsof.com
* @license http://www.Phpsof.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 configurations (config.php)
Furthermore, follow the below process to define database settings and Instagram API configuration constant variables in the config.php file.
Database constant variables:
- DB_HOST – put the database host
- DB_USERNAME – put the database username
- DB_PASSWORD – put the database password
- DB_NAME – put the database name
- DB_USER_TBL – Mention the table name where the user profile information will get stored
Instagram API constant variables:
- INSTAGRAM_CLIENT_ID – Mention Instagram Client ID
- INSTAGRAM_CLIENT_SECRET – Mention Instagram Client Secret
- INSTAGRAM_REDIRECT_URI – Mention the Callback URL
Begin with Instagram Auth class
Further, you can use the Instagram Auth library to connect with Instagram API and work with 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
));
Moreover, you will find the Client ID and Client Secret on your Instagram settings.
Login on Instagram to login with Instagram using PHP and find the user data (index.php)
- Firstly, you need to generate the authentication URL using the getAuthURL()method of Instagram Auth class.
- After that, the Sign IN button will display on the website.
- When user authenticates with the Instagram account, the below steps follows:
- The access_token gets retrieved from the Instagram account through the getUserProfileInfo() by the access_token.
- The profile data gets inserted into the database through the checkUser() function.
- The user’s profile data gets stored in the PHP.
- The Instagram details like username, display picture, and profile link gets displayed on the page.
<?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 Phpsof</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)
Moreover, If the user wants to log out from the Instagram account, then you have to load the logout.php file.
- You need to remove the user data and access token from the SESSION.
- You need to redirect the user to the homepage.
Conclusion
So, this is how you can login with Instagram using PHP. You can effortlessly integrate the Instagram API with PHP Client URL. The Instagram Auth library makes the login process easier.
Also Read, A complete tutorial to compress Image before upload using PHP