How to get an email address with a LinkedIn signup API with PHP
Asked Answered
J

9

6

I got this code from some tutorial about linked signup, but the tutorial provide just the basic information. I need to get the user email also... How can I do that?

Here is the code:

auth.php

This is the link where I get access form on likedin.

<?php
    session_start();
    $config['base_url']             =   '';
    $config['callback_url']         =   '';
    $config['linkedin_access']      =   '';
    $config['linkedin_secret']      =   '';

    include_once "linkedin.php";

    # First step is to initialize with your consumer key and secret. We'll use an out-of-band oauth_callback
    $linkedin = new LinkedIn($config['linkedin_access'], $config['linkedin_secret'], $config['callback_url'] );
    //$linkedin->debug = true;

    # Now we retrieve a request token. It will be set as $linkedin->request_token
    $linkedin->getRequestToken();
    $_SESSION['requestToken'] = serialize($linkedin->request_token);

    # With a request token in hand, we can generate an authorization URL, which we'll direct the user to
    //echo "Authorization URL: " . $linkedin->generateAuthorizeUrl() . "\n\n";
    header("Location: " . $linkedin->generateAuthorizeUrl()); ?>

demo.php

This is the script that I get after signup.

<?php
    session_start();

    $config['base_url']             =   'http://xxx/linkedin/auth.php';
    $config['callback_url']         =   'http://xxx/linkedin/demo.php';
    $config['linkedin_access']      =   '';
    $config['linkedin_secret']      =   '';

    include_once "linkedin.php";

    # First step is to initialize with your consumer key and secret. We'll use an out-of-band oauth_callback
    $linkedin = new LinkedIn($config['linkedin_access'], $config['linkedin_secret'], $config['callback_url'] );
    //$linkedin->debug = true; if (isset($_REQUEST['oauth_verifier'])){
    $_SESSION['oauth_verifier']     = $_REQUEST['oauth_verifier'];

    $linkedin->request_token    =   unserialize($_SESSION['requestToken']);
    $linkedin->oauth_verifier   =   $_SESSION['oauth_verifier'];
    $linkedin->getAccessToken($_REQUEST['oauth_verifier']);

    $_SESSION['oauth_access_token'] = serialize($linkedin->access_token);
    header("Location: " . $config['callback_url']);
    exit;}   else{
    $linkedin->request_token    =   unserialize($_SESSION['requestToken']);
    $linkedin->oauth_verifier   =   $_SESSION['oauth_verifier'];
    $linkedin->access_token     =   unserialize($_SESSION['oauth_access_token']);}

    # You now have a $linkedin->access_token and can make calls on behalf of the current member
    $xml_response = $linkedin->getProfile("~:(id,first-name,last-name,headline,picture-url)");


    $id = $linkedin->getProfile('~:(id)');
    $fname = $linkedin->getProfile('~:(first-name)');
    $lname = $linkedin->getProfile('~:(last-name)');
    $headline = $linkedin->getProfile('~:(headline)');
    $picture = $linkedin->getProfile('~:(picture-url)');

    $id = trim(strip_tags($id));
    $fname = trim(strip_tags($fname));
    $lname = trim(strip_tags($lname));
    $headline = trim(strip_tags($headline));
    $picture = trim(strip_tags($picture)); ?>

linkedin.php

This is LinkedIn library:

<?php require_once("OAuth.php"); class LinkedIn {
    public $base_url = "http://api.linkedin.com";
    public $secure_base_url = "https://api.linkedin.com";
    public $oauth_callback = "oob";
    public $consumer;
    public $request_token;
    public $access_token;
    public $oauth_verifier;
    public $signature_method;
    public $request_token_path;
    public $access_token_path;
    public $authorize_path;

    function __construct($consumer_key, $consumer_secret, $oauth_callback = NULL)
    {

        if($oauth_callback) {
            $this->oauth_callback = $oauth_callback;
        }

        $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret, $this->oauth_callback);
        $this->signature_method = new OAuthSignatureMethod_HMAC_SHA1();
        $this->request_token_path = $this->secure_base_url . "/uas/oauth/requestToken";
        $this->access_token_path = $this->secure_base_url . "/uas/oauth/accessToken";
        $this->authorize_path = $this->secure_base_url . "/uas/oauth/authorize";
    }

    function getRequestToken()
    {
        $consumer = $this->consumer;
        $request = OAuthRequest::from_consumer_and_token($consumer, NULL, "GET", $this->request_token_path);
        $request->set_parameter("oauth_callback", $this->oauth_callback);
        $request->sign_request($this->signature_method, $consumer, NULL);
        $headers = Array();
        $url = $request->to_url();
        $response = $this->httpRequest($url, $headers, "GET");
        parse_str($response, $response_params);
        $this->request_token = new OAuthConsumer($response_params['oauth_token'], $response_params['oauth_token_secret'], 1);
    }

    function generateAuthorizeUrl()
    {
        $consumer = $this->consumer;
        $request_token = $this->request_token;
        return $this->authorize_path . "?oauth_token=" . $request_token->key;
    }

    function getAccessToken($oauth_verifier)
    {
        $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->request_token, "GET", $this->access_token_path);
        $request->set_parameter("oauth_verifier", $oauth_verifier);
        $request->sign_request($this->signature_method, $this->consumer, $this->request_token);
        $headers = Array();
        $url = $request->to_url();
        $response = $this->httpRequest($url, $headers, "GET");
        parse_str($response, $response_params);
        $this->access_token = new OAuthConsumer($response_params['oauth_token'], $response_params['oauth_token_secret'], 1);
    }

    function getProfile($resource = "~")
    {
        $profile_url = $this->base_url . "/v1/people/" . $resource;
        $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->access_token, "GET", $profile_url);
        $request->sign_request($this->signature_method, $this->consumer, $this->access_token);
        $auth_header = $request->to_header("https://api.linkedin.com"); # this is the realm
        # This PHP library doesn't generate the header correctly when a realm is not specified.
        # Make sure there is a space and not a comma after OAuth
        // $auth_header = preg_replace("/Authorization\: OAuth\,/", "Authorization: OAuth ", $auth_header);
        // # Make sure there is a space between OAuth attribute
        // $auth_header = preg_replace('/\"\,/', '", ', $auth_header);

        // $response will now hold the XML document
        $response = $this->httpRequest($profile_url, $auth_header, "GET");
        return $response;
    }

    function setStatus($status)
    {
        $profile_url = $this->base_url . "/v1/people/~";
        $status_url = $this->base_url . "/v1/people/~/current-status";
        echo "Setting status...\n";
        $xml = "<current-status>" . htmlspecialchars($status, ENT_NOQUOTES, "UTF-8") . "</current-status>";
        echo $xml . "\n";
        $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->access_token, "PUT", $status_url);
        $request->sign_request($this->signature_method, $this->consumer, $this->access_token);
        $auth_header = $request->to_header("https://api.linkedin.com");

        $response = $this->httpRequest($profile_url, $auth_header, "GET");
        return $response;
    }

    # Parameters should be a query string starting with "?"
    # Example search("?count=10&start=10&company=LinkedIn");
    function search($parameters)
    {
        $search_url = $this->base_url . "/v1/people-search:(people:(id,first-name,last-name,picture-url,site-standard-profile-request,headline),num-results)" . $parameters;
        //$search_url = $this->base_url . "/v1/people-search?keywords=facebook";

        echo "Performing search for: " . $parameters . "<br />";
        echo "Search URL: $search_url <br />";
        $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->access_token, "GET", $search_url);
        $request->sign_request($this->signature_method, $this->consumer, $this->access_token);
        $auth_header = $request->to_header("https://api.linkedin.com");
        $response = $this->httpRequest($search_url, $auth_header, "GET");
        return $response;
    }

    function httpRequest($url, $auth_header, $method, $body = NULL)
    {
        if (!$method) {
            $method = "GET";
        };

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array($auth_header)); // Set the headers.

        if ($body) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
            curl_setopt($curl, CURLOPT_HTTPHEADER, array($auth_header, "Content-Type: text/xml;charset=utf-8"));
        }

        $data = curl_exec($curl);
        curl_close($curl);
        return $data;
    }}
Jamilla answered 3/1, 2013 at 19:14 Comment(0)
F
23

The email address is only available to the authenticated user and not his/her connections.

  1. Make sure you've requested the r_emailaddress member permissions from the user when authorizing your application. Authentication covers authentication and grant member permissions in detail.

  2. Make the following GET call to fetch the email address for the authenticated user:

    GET http://api.linkedin.com/v1/people/~:(email-address)
    
Fescue answered 10/1, 2013 at 22:31 Comment(1)
Thanks. This was added relatively recently (Aug 6, 2012)Fescue
A
19

For people searching for v2 urls

please follow the below urls

 payload = {
        'grant_type': 'authorization_code',
        'code': token,
        'redirect_uri': s.SOCIAL_AUTH_CALLBACK_URL,
        'client_id': s.LINKED_IN_CLIENT_ID,
        'client_secret': s.LINKED_IN_CLIENT_SECRET
    }

POST "https://www.linkedin.com/oauth/v2/accessToken" 

to get access token

GET "https://api.linkedin.com/v2/me"

to get the user data send auth token in header

GET "https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))"

to get user email address.

Anjelicaanjou answered 16/4, 2019 at 6:57 Comment(2)
can i get email and other information like name and phone together @pawanGoldsworthy
check this learn.microsoft.com/en-us/linkedin/shared/integrations/people/…Anjelicaanjou
D
7

You can get email address via api $this->userProfileUrl = "https://api.linkedin.com/v1/people/~:(id,first-name,last-name,picture-url,public-profile-url,email-address)?oauth2_access_token=";

But you have to set scope like $oauth->scope = 'r_basicprofile,r_emailaddress'; use Oauth https://developer-programs.linkedin.com/documents/profile-api

Or try https://developer.linkedin.com/docs/oauth2

Depreciation answered 23/11, 2015 at 12:22 Comment(0)
S
5

You can access the linkedin user email address with below EP:

`https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))`

Make sure that you have defined the scope 'r_emailaddress' in your library. You can use below curl request to fetch the data:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $Url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
      'Authorization: Bearer '. $token,
      'X-Restli-Protocol-Version: 2.0.0',
      'Accept: application/json',
      'Content-Type: application/json'
    ));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $response = curl_exec($ch);
    $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $body = substr($response, $headerSize);
    $response_body = json_decode($body,true);

$response_body will return the following response:

Array (
    [elements] => Array
        (
            [0] => Array
                (
                    [handle] => urn:li:emailAddress:123456
                    [handle~] => Array
                        (
                            [emailAddress] => [email protected]
                        )

                )

        )

)
Soleure answered 18/4, 2019 at 5:18 Comment(2)
Your comment has helped me a lot, however, I cannot access "emailAddress" because I have a problem with this sign (handle ~) What would be the correct way to access the email to save it in the database? ... Thank you,Archipelago
$a = 'handle~'; $email = $response_body->elements[0]->$a->emailAddress;Analogue
M
3

You should pass '&scope=r_basicprofile+r_emailaddress' this at time of AccessToken Request

Step 1: AccessToken Request will be like

https://www.linkedin.com/oauth/v2/accessToken?grant_type=authorization_code&code={Your code}&redirect_uri={Yourredirect_uri}&client_id={Your client_id}&client_secret={Your client_secret }&scope=r_liteprofile+r_emailaddress

This will return you the AccessToken using which You do have to make 2 more requests 1 is for Email and Profile Details

Step 2: for Email request will be like

https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))&oauth2_access_token={AccessToken You get from step 1}'

Step 3: for basic profile request will be like

https://api.linkedin.com/v2/me?projection=(id,firstName,lastName,emailAddress,profilePicture(displayImage~:playableStreams))&oauth2_access_token={AccessToken You get from step 1}'
Mestizo answered 30/4, 2020 at 20:25 Comment(0)
H
1

The LinkedIn API does not offer the email address as part of the profile object. See the docs here to read what data is available.

EDIT: See Kamyar's answer. Apparently as of August 2012 LinkedIn now allows pulling the email addresses.

Heterozygous answered 3/1, 2013 at 19:21 Comment(1)
There is some option, but I am not that level experienced :)Jamilla
Q
0

You can try :

->elements[0]->{"handle~"}->emailAddress

goodluck

Quadruplex answered 11/8, 2020 at 8:51 Comment(0)
M
0

Latest script

The scopes r_liteprofile and r_emailaddress are deprecated.

Now, you need to add the product "Sign In with LinkedIn using OpenID Connect" to you app. You should use the scopes openid, email, and profile instead of the old r_liteprofile and r_emailaddress scopes.

When you make a request from authorization code to access token, you will receive the new response field id_token.

You can retrieve the user's email information from the id_token using the code below:

$id_token = 'eyJ6aXAiOiJSUzI1NiIsInR5cCI6IkpXVCIsImtp.....';     
$parts = explode('.', $id_token);
 $header = $parts[0];
 $payload = $parts[1];
 $signature = $parts[2];

 $payload_decoded = base64_decode(str_replace(['-', '_'], ['+', '/'], $payload));
 $payload_json = json_decode($payload_decoded, true);
 
 echo '<pre>'; print_r($payload_json); die(' Test');

Sign In with LinkedIn using OpenID Connect docs

Miramirabeau answered 28/9, 2024 at 11:43 Comment(0)
P
-1

Step 1: AccessToken Request

$postData = array(
    'grant_type' => 'authorization_code',
    'code' => urldecode(trim($_GET['code'])),
    'redirect_uri' => url_for('social_login/linkedin'),
    'client_id' => CFG_LINKEDIN_APP_ID,
    'client_secret' => CFG_LINKEDIN_SECRET_KEY
);

$ch = curl_init("https://www.linkedin.com/oauth/v2/accessToken");    
curl_setopt($ch, CURLOPT_HEADER, array('Content-Type' => 'application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
$response = curl_exec($ch);

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);    
$body = substr($response, $header_size);

curl_close($ch);

if(!$response)
{
    die('Curl error: ' . curl_error($ch));       
}
                
$response = json_decode($body,true);

In $response you will find the AccessToken using which You do have to make 2 more requests 1 is for Email and Profile Details

Step 2: profile request

$access_token = $response['access_token']; 
   
$ch = curl_init('https://api.linkedin.com/v2/me?projection=(id,firstName,lastName,emailAddress,profilePicture(displayImage~:playableStreams))&oauth2_access_token=' . $access_token);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);        
$response = curl_exec($ch);
curl_close($ch);

Step 3: for Email request

$ch = curl_init('https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))&oauth2_access_token=' . $access_token);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);        
$response2 = curl_exec($ch);
curl_close($ch);

Result: user data

$user = [
    'first_name' => current($response['firstName']['localized']),
    'last_name' => current($response['lastName']['localized']),
    'photo' => $response['profilePicture']['displayImage~']['elements'][0]['identifiers'][0]['identifier'],
    'email' => $response2['elements'][0]['handle~']['emailAddress']
];
Peak answered 12/5, 2021 at 4:46 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.