Skip to content
Snippets Groups Projects
Commit e737c5e8 authored by Michal Procházka's avatar Michal Procházka
Browse files

LinkedIn.php in PSR-2

parent 88652a21
No related branches found
No related tags found
No related merge requests found
...@@ -8,118 +8,137 @@ require_once(dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/oauth/lib ...@@ -8,118 +8,137 @@ require_once(dirname(dirname(dirname(dirname(dirname(__FILE__))))) . '/oauth/lib
* @author Brook Schofield, TERENA. * @author Brook Schofield, TERENA.
* @package SimpleSAMLphp * @package SimpleSAMLphp
*/ */
class sspmod_authlinkedin_Auth_Source_LinkedIn extends SimpleSAML_Auth_Source { class sspmod_authlinkedin_Auth_Source_LinkedIn extends SimpleSAML_Auth_Source
{
/** /**
* The string used to identify our states. * The string used to identify our states.
*/ */
const STAGE_INIT = 'authlinkedin:init'; const STAGE_INIT = 'authlinkedin:init';
/** /**
* The key of the AuthId field in the state. * The key of the AuthId field in the state.
*/ */
const AUTHID = 'authlinkedin:AuthId'; const AUTHID = 'authlinkedin:AuthId';
private $key; private $key;
private $secret; private $secret;
private $attributes; private $attributes;
/** /**
* Constructor for this authentication source. * Constructor for this authentication source.
* *
* @param array $info Information about this authentication source. * @param array $info Information about this authentication source.
* @param array $config Configuration. * @param array $config Configuration.
*/ */
public function __construct($info, $config) { public function __construct($info, $config)
assert('is_array($info)'); {
assert('is_array($config)'); assert('is_array($info)');
assert('is_array($config)');
// Call the parent constructor first, as required by the interface // Call the parent constructor first, as required by the interface
parent::__construct($info, $config); parent::__construct($info, $config);
if (!array_key_exists('key', $config)) if (!array_key_exists('key', $config))
throw new Exception('LinkedIn authentication source is not properly configured: missing [key]'); throw new Exception('LinkedIn authentication source is not properly configured: missing [key]');
$this->key = $config['key']; $this->key = $config['key'];
if (!array_key_exists('secret', $config)) if (!array_key_exists('secret', $config))
throw new Exception('LinkedIn authentication source is not properly configured: missing [secret]'); throw new Exception('LinkedIn authentication source is not properly configured: missing [secret]');
$this->secret = $config['secret']; $this->secret = $config['secret'];
if (array_key_exists('attributes', $config)) { if (array_key_exists('attributes', $config)) {
$this->attributes = $config['attributes']; $this->attributes = $config['attributes'];
} else { } else {
// Default values if the attributes are not set in config (ref https://developer.linkedin.com/docs/fields) // Default values if the attributes are not set in config (ref https://developer.linkedin.com/docs/fields)
$this->attributes = 'id,first-name,last-name,headline,summary,specialties,picture-url,email-address'; $this->attributes = 'id,first-name,last-name,headline,summary,specialties,picture-url,email-address';
} }
} }
/** /**
* Log-in using LinkedIn platform * Log-in using LinkedIn platform
* Documentation at: http://developer.linkedin.com/docs/DOC-1008 * Documentation at: http://developer.linkedin.com/docs/DOC-1008
* *
* @param array &$state Information about the current authentication. * @param array &$state Information about the current authentication.
*/ */
public function authenticate(&$state) { public function authenticate(&$state)
assert('is_array($state)'); {
assert('is_array($state)');
// We are going to need the authId in order to retrieve this authentication source later // We are going to need the authId in order to retrieve this authentication source later
$state[self::AUTHID] = $this->authId; $state[self::AUTHID] = $this->authId;
$stateID = SimpleSAML_Auth_State::getStateId($state); $stateID = SimpleSAML_Auth_State::getStateId($state);
SimpleSAML\Logger::debug('authlinkedin auth state id = ' . $stateID); SimpleSAML\Logger::debug('authlinkedin auth state id = ' . $stateID);
$consumer = new sspmod_oauth_Consumer($this->key, $this->secret); $consumer = new sspmod_oauth_Consumer($this->key, $this->secret);
// Get the request token // Get the request token
$requestToken = $consumer->getRequestToken('https://api.linkedin.com/uas/oauth/requestToken', array('oauth_callback' => SimpleSAML\Module::getModuleUrl('authlinkedin') . '/linkback.php?stateid=' . $stateID)); $requestToken = $consumer->getRequestToken(
'https://api.linkedin.com/uas/oauth/requestToken',
array('oauth_callback' => SimpleSAML\Module::getModuleUrl('authlinkedin') . '/linkback.php?stateid=' . $stateID)
);
SimpleSAML\Logger::debug("Got a request token from the OAuth service provider [" . SimpleSAML\Logger::debug(
$requestToken->key . "] with the secret [" . $requestToken->secret . "]"); "Got a request token from the OAuth service provider [" .
$requestToken->key . "] with the secret [" . $requestToken->secret . "]"
);
$state['authlinkedin:requestToken'] = $requestToken; $state['authlinkedin:requestToken'] = $requestToken;
// Update the state // Update the state
SimpleSAML_Auth_State::saveState($state, self::STAGE_INIT); SimpleSAML_Auth_State::saveState($state, self::STAGE_INIT);
// Authorize the request token // Authorize the request token
$consumer->getAuthorizeRequest('https://www.linkedin.com/uas/oauth/authenticate', $requestToken); $consumer->getAuthorizeRequest('https://www.linkedin.com/uas/oauth/authenticate', $requestToken);
} }
public function finalStep(&$state) { public function finalStep(&$state)
$requestToken = $state['authlinkedin:requestToken']; {
$requestToken = $state['authlinkedin:requestToken'];
$consumer = new sspmod_oauth_Consumer($this->key, $this->secret); $consumer = new sspmod_oauth_Consumer($this->key, $this->secret);
SimpleSAML\Logger::debug("oauth: Using this request token [" . SimpleSAML\Logger::debug(
$requestToken->key . "] with the secret [" . $requestToken->secret . "]"); "oauth: Using this request token [" .
$requestToken->key . "] with the secret [" . $requestToken->secret . "]"
);
// Replace the request token with an access token (via GET method) // Replace the request token with an access token (via GET method)
$accessToken = $consumer->getAccessToken('https://api.linkedin.com/uas/oauth/accessToken', $requestToken, $accessToken = $consumer->getAccessToken(
array('oauth_verifier' => $state['authlinkedin:oauth_verifier'])); 'https://api.linkedin.com/uas/oauth/accessToken', $requestToken,
array('oauth_verifier' => $state['authlinkedin:oauth_verifier'])
);
SimpleSAML\Logger::debug("Got an access token from the OAuth service provider [" . SimpleSAML\Logger::debug(
$accessToken->key . "] with the secret [" . $accessToken->secret . "]"); "Got an access token from the OAuth service provider [" .
$accessToken->key . "] with the secret [" . $accessToken->secret . "]"
);
$userdata = $consumer->getUserInfo('https://api.linkedin.com/v1/people/~:(' . $this->attributes . ')', $accessToken, array('http' => array('header' => 'x-li-format: json'))); $userdata = $consumer->getUserInfo(
'https://api.linkedin.com/v1/people/~:(' . $this->attributes . ')',
$accessToken,
array('http' => array('header' => 'x-li-format: json'))
);
$attributes = $this->flatten($userdata, 'linkedin.'); $attributes = $this->flatten($userdata, 'linkedin.');
// TODO: pass accessToken: key, secret + expiry as attributes? // TODO: pass accessToken: key, secret + expiry as attributes?
if (array_key_exists('id', $userdata) ) { if (array_key_exists('id', $userdata)) {
$attributes['linkedin_targetedID'] = array('http://linkedin.com!' . $userdata['id']); $attributes['linkedin_targetedID'] = array('http://linkedin.com!' . $userdata['id']);
$attributes['linkedin_user'] = array($userdata['id'] . '@linkedin.com'); $attributes['linkedin_user'] = array($userdata['id'] . '@linkedin.com');
} }
SimpleSAML\Logger::debug('LinkedIn Returned Attributes: '. implode(", ",array_keys($attributes))); SimpleSAML\Logger::debug('LinkedIn Returned Attributes: '. implode(", ",array_keys($attributes)));
$state['Attributes'] = $attributes; $state['Attributes'] = $attributes;
} }
/** /**
* takes an associative array, traverses it and returns the keys concatenated with a dot * takes an associative array, traverses it and returns the keys concatenated with a dot
...@@ -148,7 +167,8 @@ class sspmod_authlinkedin_Auth_Source_LinkedIn extends SimpleSAML_Auth_Source { ...@@ -148,7 +167,8 @@ class sspmod_authlinkedin_Auth_Source_LinkedIn extends SimpleSAML_Auth_Source {
* *
* @return array the array with the new concatenated keys * @return array the array with the new concatenated keys
*/ */
protected function flatten($array, $prefix = '') { protected function flatten($array, $prefix = '')
{
$result = array(); $result = array();
foreach ($array as $key => $value) { foreach ($array as $key => $value) {
if (is_array($value)) { if (is_array($value)) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment