LinkedIn authenticatie met Zend en OAuth

Door StephanVierkant op zaterdag 11 juni 2011 13:28 - Reacties (5)
Categorie: php, Views: 3.453

Ik heb lang gezocht naar een goed script om met LinkedIn te kunnen inloggen. Ik kon eigenlijk geen goede scripts vinden. Of dat aan mijn zoekcapaciteiten ligt of aan het aanbod, laat ik even in het midden.

Ik heb uiteindelijk een script kunnen vinden. Het moest nog wat worden aangepast omdat het anderhalf jaar oud was, maar inmiddels werkt het. De site waar ik het vandaan had, is inmiddels offline.

Het script werkt met het OAuth-protocol met het Zend Framework.

Omdat ik zelf ook wat aanpassingen heb gemaakt (niet alleen maar die login via een sessie bewaren, maar ook met een cookie), wil ik het graag met iedereen delen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
*
* @abstract: This Class can be used to Access LinkedIn API using Oauth Authentication Protocol
* @author: Stephan Vierkant (original by Christophe Fiat, FormatiX.EU)
* @version: 0.2 2011-06-11
*
*/

class linkedIn
{
    private $options;
    private $consumer;
    private $client;
    private $token;

    public function __construct($consumerKey, $consumerSecret)
    {
        set_include_path('../' . PATH_SEPARATOR . get_include_path() );

        require_once('Zend/Oauth/Consumer.php');

        $this->options = array(
        'version' => '1.0',
        'siteUrl' =>  'https://api.linkedin.com/uas/oauth',
        'callbackUrl' => 'http://localhost/',
        'requestTokenUrl' => 'https://api.linkedin.com/uas/oauth/requestToken',
        'userAuthorisationUrl' => 'https://api.linkedin.com/uas/oauth/authorize',
        'accessTokenUrl' => 'https://api.linkedin.com/uas/oauth/accessToken',
        'consumerKey' => $consumerKey,
        'consumerSecret' => $consumerSecret
        );

        $this->consumer = new Zend_Oauth_Consumer( $this->options );
    }
    private function setToken($token)
    {
        $_SESSION['ACCESS_TOKEN'] = serialize ( $token );
        
        //set time
        $time = 60 * 60 * 24 * 7;
        setcookie("ACCESS_TOKEN", serialize ( $token ), time()+ $time);
    }
    private function getToken()
    {
        if (isset($_SESSION ['ACCESS_TOKEN']))
        {
            return unserialize($_SESSION ['ACCESS_TOKEN']);
        }
        elseif(isset($_COOKIE['ACCESS_TOKEN']))
        {
            return unserialize(stripslashes($_COOKIE['ACCESS_TOKEN']));
        }
        else
        {
            return false;
        }
    }

    public function connect()
    {
        // Start Session to be able to store Request Token and Access Token
        session_start ();
        
        if ( $this->getToken() == false)
        {
            // We do not have any Access token Yet
            if (! empty ( $_GET ))
            {
                // But We have some parameters passed throw the URL

                // Get the LinkedIn Access Token
                $this->token = $this->consumer->getAccessToken ( $_GET, unserialize ( $_SESSION ['REQUEST_TOKEN'] ) );

                // Store the LinkedIn Access Token
                $this->setToken($this->token);
            }
            else
            {
                //We have Nothing

                // Start Requesting a LinkedIn Request Token
                $this->token = $this->consumer->getRequestToken ();

                // Store the LinkedIn Request Token
                $_SESSION ['REQUEST_TOKEN'] = serialize ( $this->token );
            
                // Redirect the Web User to LinkedIn Authentication  Page
                $this->consumer->redirect ();
            }
        } else {
            //We've already Got a LinkedIn Access Token

            // Restore The LinkedIn Access Token
            $this->token = $this->getToken();
        }

        // Use HTTP Client with built-in OAuth request handling
        $this->client = $this->token->getHttpClient($this->options);
    }

    public function getId()
    {
        // Set LinkedIn URI
        $this->client->setUri('https://api.linkedin.com/v1/people/~:(id)');
        // Set Method (GET, POST or PUT)
        $this->client->setMethod(Zend_Http_Client::GET);
        // Get Request Response
        $response = $this->client->request();

        // Get the XML containing User's Profile
        $content =  $response->getBody();

        // Use simplexml to transform XML to a PHP Object
        $xml = simplexml_load_string($content);

        // Uncomment Following Line To display Simple XML Object Structure
        return $xml->id;
    }

} // Class End



Als je hem wilt gebruiken:

PHP:
1
2
3
4
5
$linkedin = new linkedIn('consumerKey', 'consumerSecret');
$linkedin->connect();

//met dit ID kun je vervolgens verder werken (bijvoorbeeld in je eigen database kijken of deze persoon toegang tot je applicatie heeft)
$linkedin->getID();


To-do:
  • Er is nog geen functie voor het uitloggen (anders dan gewoon de cookie en/of sessie unsetten)
Dit is eigenlijk de eerste keer dat ik een (weliswaar aangepast) script met de wereld deel, dus suggesties/klachten/verzoekjes zijn zeer welkom!