Exemplo utilizando PHP 5.3
Antes de Começar
Certifique-se de que você tem todos os dados descritos aqui antes de seguir o tutorial.
Dependências
Para conectar no Login Cidadão usando PHP 5.3
é utilizado o cliente OAuth desenvolvido pelo fkooman. Uma vez que é usado php5.3 é possivel usar o composer
para instalar o componente e suas dependecias. Primeiramente, é necessario instalar o composer.
No arquivo composer.json
basta adicionar a seguinte configuração:
{ "name": "fkooman/php-oauth-client-example", "require": { "fkooman/guzzle-bearer-auth-plugin": "dev-master", "fkooman/php-oauth-client": "dev-master" } }
Utilizando a linha de comando, no mesmo diretorio que esta o arquivo composer.json
é possivel executar o seguinte comando: composer install --prefer-dist
. Assim o composer
instalará o componente desejado e suas dependencias.
Começando
Arquivo de configuração
Primeiramente criamos um arquivo de configuração config.ini
referente ao servidor OAuth que desejamos utilizar. Nesse arquivo, especificamos o endereço para fazer a autenticação, o endereço para obter o Access Token, o endereço para onde o gerenciador de identidades irá retornar os dados, a chave pública, a chave privada, o nome do servidor, os escopos desejados e o endereço para obter os dados do usuário:
[fkooman_client_config] //endereço para fazer a autenticação authorize_endpoint = "https://meu.rs.gov.br/oauth/v2/auth"; //endereço para requerer o Access Token token_endpoint = "https://meu.rs.gov.br/oauth/v2/token"; //endereço para retornar os dados redirect_uri = "http://localhost/callback.php"; //chave pública client_id = ""; //chave privada client_secret = ""; [fkooman_api_config] //nome do servidor api_context = "Meu" //escopos api_scopes = "id username full_name cpf birthdate email city picture public_profile badges country state city addresses id_cards get_all_notifications notifications cep mobile"; //endereço para requerer os dados do usuário api_url = "https://meu.rs.gov.br/api/v1/person.json";
Criando um script de autenticação
É necessário criar um script que oferece a possibilidade do usuario autenticar. Esse script tem que testar se o usuário ja esta autenticado. No momento que o script detectar que o usuário esta autenticado, ele que pegar as informação sobre esse usuário.
//primeiro carregamos as configurações $config = parse_ini_file('config.ini'); if (false === $config) { die('please you need to have a config.ini file. Make one based on config.ini.dist'); } //com as configurações é criado um instância das configurações do cliente $clientConfig = new \fkooman\OAuth\Client\ClientConfig($config); //criamos uma instância para armazenar os dados utilizados pelo Oauth $tokenStorage = new \fkooman\OAuth\Client\SessionStorage(); //criamos uma instância para fazer a comunicação http $httpClient = new \Guzzle\Http\Client(); //criamos uma instância para utilizar a API do nosso gerenciador de identidades $api = new fkooman\OAuth\Client\Api($config['api_context'], $clientConfig, $tokenStorage, $httpClient); //configuramos o contexto da nossa API $context = new \fkooman\OAuth\Client\Context($config['api_context'], explode(" ", $config['api_scopes'])); //verificamos se já temos uma Access Token $accessToken = $api->getAccessToken($context); if (false === $accessToken) { //caso não tenhamos uma Access Token //se temos uma variável indicando que desejamos autenticar if ($_GET['authorize'] == 1) { //enviamos o usuario para a tela de autorização do gerenciador de identidades header("HTTP/1.1 302 Found"); header("Location: " . $api->getAuthorizeUri($context)); } else { //oferecemos a autenticação para o usuário echo "<a href='index.php?authorize=1'>Logar com o Login do Cidadao</a>"; } exit; } else { //caso tenhamos a Access token podemos consultar a API e obter os dados dele try { $client = new \Guzzle\Http\Client(); $bearerAuth = new \fkooman\Guzzle\Plugin\BearerAuth\BearerAuth($accessToken->getAccessToken()); $client->addSubscriber($bearerAuth); $response = $client->get($config['api_url'])->send(); header("Content-Type: application/json"); //o retorno da API é um no formato JSON, por isso temos que decodifica-la $json = json_decode($response->getBody(), true); if (false !== $json) { print_r($json); } else { print_r($response->getBody()); } } catch (\fkooman\Guzzle\Plugin\BearerAuth\Exception\BearerErrorResponseException $e) { //caso tenhamos um erro de token inválida, jogamos essa token fora, tentamos autenticar novamente if ("invalid_token" === $e->getBearerReason()) { $api->deleteAccessToken($context); $api->deleteRefreshToken($context); header("HTTP/1.1 302 Found"); header("Location: " . $api->getAuthorizeUri($context)); exit; } throw $e; } catch (\Exception $e) { die(sprintf('ERROR: %s', $e->getMessage())); } } }
Criando um script que recebe o retorno do gerenciador de identidades
Também é necessario criar um script que recebe os dados de retorno do gerenciador de identidades. Esse script quando receber os dados do servidor deve encaminhar para o script de autenticação
//primeiro carregamos as configurações $config = parse_ini_file('config.ini'); if (false === $config) { die('please you need to have a config.ini file. Make one based on config.ini.dist'); } //com as configurações é criado um instância das configurações do cliente $clientConfig = new \fkooman\OAuth\Client\ClientConfig($config); try { //criamos uma instância para armazenar os dados utilizados pelo Oauth $tokenStorage = new \fkooman\OAuth\Client\SessionStorage(); //criamos uma instância para fazer a comunicação http $httpClient = new \Guzzle\Http\Client(); //criamos uma instância para lidar com o retorno do gerenciador de identidades $cb = new \fkooman\OAuth\Client\Callback($config['api_context'], $clientConfig, $tokenStorage, $httpClient); $cb->handleCallback($_GET); //direcionamos para o script de autenticação header("HTTP/1.1 302 Found"); header("Location: index.php"); exit; } catch (\fkooman\OAuth\Client\AuthorizeException $e) { die(sprintf("ERROR: %s, DESCRIPTION: %s", $e->getMessage(), $e->getDescription())); } catch (\Exception $e) { die(sprintf("ERROR: %s", $e->getMessage())); }
Com esses dois script é possivel autenticar o usuário e recuperar suas informações do gerenciador de identidades