H1berto

Autenticando com OAuth LinkedIn – PHP+

À partir do dia 01 de Maio de 2019 o método antigo do Linkedin de fazer login em seu site será descontinuado e não funcionará mais, visualizando esta situação montei essa explicação para que vocês consigam entender e aplicar o novo método utilizado por eles.

Primeiro passo:

Para iniciar é necessário criar um aplicativo no Linkedin
Se você já tiver o aplicativo é necessário acessa-lo e modifica-lo
Entre na opção “Auth” e configure o link de retorno do aplicativo.
Esse link é necessário para que o sistema de login funcione corretamente.

OAuth LinkedIn PHP

Cada aplicativo recebe um ID exclusivo, reserve-o pois iremos utilizar.

OAuth Linkedin PHP

O Client Secret recomendamos não revelar a ninguém.

Segundo Passo:

Após tudo isso começamos a programar, criamos primeiro o link de login:

<a href="https://www.linkedin.com/uas/oauth2/authorization?response_type=code&client_id=XXXXX&redirect_uri=XXXXXXX&state=987654321&scope=r_liteprofile">CONECTAR COM O LINKEDIN</a>

client_id = Seu id pego no primeiro passo
redirect_uri = O link colocado no primeiro passo (recomendamos colocar o link com a pagina php que estamos criando)

Terceiro passo:

Após a pessoa clicar no link ela será redirecionada para a pagina do linkedin onde autorizará o acesso, após isso o linkedin redicionará a pessoa para o link colocado no redirect_uri com o CODE, e com esse get faremos o acesso.

Login com o Linkedin

Simulando que a pessoa já autorizou faremos a parte onde com o CODE pegamos o ACCESS TOKEN que agora sim com esse acesso conseguimos acessar os dados da pessoa.

$curl = curl_init();
	curl_setopt_array($curl, [
	    CURLOPT_RETURNTRANSFER => 1,
	    CURLOPT_URL => 'https://www.linkedin.com/uas/oauth2/accessToken?grant_type=authorization_code&code='.$_GET['code'].'&redirect_uri=[link do passo 1]&client_id=[id do passo 1]&client_secret=[secreto do passo 1]',
	    CURLOPT_POST => 1,
	    CURLOPT_POSTFIELDS => [
	        grant_type => 'authorization_code',
	        code => $_GET['code'], 
	        redirect_uri => '[link do passo 1]', 
	        client_id => '[id do passo 1]', 
	        client_secret => '[secreto do passo 1]'
	    ]
	]);
	$response = curl_exec($curl);
	curl_close($curl);

com o ACCESS TOKEN em mãos faremos a requisição dos dados da pessoa:

$access_Token = json_decode($response);
if ($access_Token->access_token){
	//header		
	$request_headers = array();
	$request_headers[] = 'Authorization: Bearer '.$access_Token->access_token;
	$request_headers[] = 'cache-control: no-cache';
	$request_headers[] = 'X-Restli-Protocol-Version: 2.0.0';
	//nome, foto
	$curl = curl_init();
	curl_setopt_array($curl, [
		CURLOPT_HEADER => 0, 
		CURLOPT_RETURNTRANSFER => 1,
		CURLOPT_HTTPHEADER => $request_headers, 
		CURLOPT_URL => 'https://api.linkedin.com/v2/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams))'
	]);
	$response = curl_exec($curl);
	curl_close($curl);
	//pega os dados
	$json_output = json_decode($response, true);
	$nome = $json_output["firstName"]["localized"]["pt_BR"].' '.$json_output["lastName"]["localized"]["pt_BR"];
	$id = $json_output["id"];
	$foto = $json_output["profilePicture"]["displayImage~"]["elements"][3]["identifiers"][0]["identifier"];
	
	echo $id.'<br>';
	echo $nome.'<br>';
	echo $foto.'<br>';
}

Código completo:

acesso.php

<?
$vurl = "url do passo 1";
$vclientid = "id do client, passo 1";
$vsecreto = "secreto do passo 1";
?>
<a href="https://www.linkedin.com/uas/oauth2/authorization?response_type=code&client_id=<?=$vclientid?>&redirect_uri=<?=vurl?>&state=987654321&scope=r_liteprofile">CONECTAR COM O LINKEDIN</a>
<?
//PARTE 2
if ($_GET['code']){
	$curl = curl_init();
	curl_setopt_array($curl, [
	    CURLOPT_RETURNTRANSFER => 1,
	    CURLOPT_URL => 'https://www.linkedin.com/uas/oauth2/accessToken?grant_type=authorization_code&code='.$_GET['code'].'&redirect_uri='.$vurl.'&client_id='.$vclientid.'&client_secret='.$vsecreto,
	    CURLOPT_POST => 1,
	    CURLOPT_POSTFIELDS => [
	        grant_type => 'authorization_code',
	        code => $_GET['code'], 
	        redirect_uri => $vurl, 
	        client_id => $vclientid, 
	        client_secret => $vsecreto
	    ]
	]);
	$response = curl_exec($curl);
	curl_close($curl);

	//PARTE 3
	$access_Token = json_decode($response);
	if ($access_Token->access_token){
		//header		
		$request_headers = array();
		$request_headers[] = 'Authorization: Bearer '.$access_Token->access_token;
		$request_headers[] = 'cache-control: no-cache';
		$request_headers[] = 'X-Restli-Protocol-Version: 2.0.0';
		//nome, foto
		$curl = curl_init();
		curl_setopt_array($curl, [
			CURLOPT_HEADER => 0, 
			CURLOPT_RETURNTRANSFER => 1,
			CURLOPT_HTTPHEADER => $request_headers, 
			CURLOPT_URL => 'https://api.linkedin.com/v2/me?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams))'
		]);
		$response = curl_exec($curl);
		curl_close($curl);
		
		$json_output = json_decode($response, true);
		$nome = $json_output["firstName"]["localized"]["pt_BR"].' '.$json_output["lastName"]["localized"]["pt_BR"];
		$id = $json_output["id"];
		$foto = $json_output["profilePicture"]["displayImage~"]["elements"][3]["identifiers"][0]["identifier"];
		
		echo $nome.'<br>';
		echo $id.'<br>';
		echo $foto.'<br>';

	}
}