Execute o seguinte comando para instalar no seu projeto um cliente GraphQL escrito em PHP chamado gmostafa/php-graphql-client:
composer require gmostafa/php-graphql-client
Arquivo app/Http/GraphqlRequests/GraphqlRequest.php
<?php
namespace App\Http\GraphqlRequests;
use GraphQL\Client;
use GraphQL\RawObject;
/**
* Controle de requisições HTTP de consultas GraphQL
*
* Class GraphqlRequest
* @package App\Http\GraphqlRequests
*/
class GraphqlRequest
{
/**
* @var string Id da aplicação no controle de microsserviços
*/
protected $appId;
/**
* @var string Key da aplicação no controle de microsserviços
*/
protected $appKey;
/**
* @var Client Cliente para conectar no servidor Graphql
*/
protected $client;
/**
* GraphqlRequest constructor.
*/
public function __construct()
{
$this->appId = env('GRAPHQL_APP_ID');
$this->appKey = env('GRAPHQL_APP_KEY');
$this->client = new Client(
env('GRAPHQL_URL')
);
}
/**
* Gera o input oara os dados de aplicação
*
* @return RawObject Entrada na controle de aplicações
*/
protected function generateAppInput(){
return new RawObject("{ appId: \"{$this->appId}\" appKey: \"{$this->appKey}\" }");
}
/**
* Gera o input para os dados de usuário
*
* @param String $login Login do usuário
* @param String $password Senha do usuário
* @return RawObject Entrada para controle de usuários
*/
protected function generateUserInput(String $login, String $password){
return new RawObject("{ login: \"${login}\" password: \"${password}\" }");
}
}
Arquivo app/Http/GraphqlRequests/AuthGraphqlRequest.php
<?php
namespace App\Http\GraphqlRequests;
use Illuminate\Http\Request;
use GraphQL\Query;
use GraphQL\RawObject;
/**
* Requisições GraphQL de Autenticação
*
* Class AuthGraphqlRequest
* @package App\Http\GraphqlRequests
*/
class AuthGraphqlRequest extends GraphqlRequest
{
/**
* Realiza o login da aplicação e do usuário
*
* @param Request $request Requisição de autenticação
* @return array Retorna um objeto cabeçalho com dois tokens (do tipo JWT bearer token) de aplicação e usuário
*/
public function loginContaInstitucional(Request $request)
{
$appInput = $this->generateAppInput();
$userInput = $this->generateUserInput($request->containstitucional, $request->password);
$input = new RawObject("{ appInput: $appInput userInput: $userInput }");
$gql = (new Query('generateTokens'))
->setArguments(['input' => $input])
->setSelectionSet(
[
(new Query('headers'))
->setSelectionSet(
[
'Application',
'Authorization'
]
)
]
);
$results = $this->client->runQuery($gql);
return $results->getResults()->data->generateTokens->headers;
}
}
Arquivo app/Http/Controllers/Auth/LoginController.php:
<?php
/**
* Attempt to log the user into the application.
* Sobrecarregando a função para alterar a maneira como se checa o usuário logado
*
* @param \Illuminate\Http\Request $request
* @return bool
*
* @throws \Exception
*/
protected function attemptLogin(Request $request)
{
try {
$authGraphqlRequest = new AuthGraphqlRequest();
$headers = $authGraphqlRequest->loginContaInstitucional($request);
// Autenticação funcionou, recuperando o usuário pela conta institucional, sem validar a senha,
// pois já foi validada pela classe AuthGraphql Request
$userModel = $this->guard()->getProvider()->createModel();
$user = $userModel->where('containstitucional', $request->containstitucional)->first();
if(is_null($user)){
throw new \Exception('Não foi encontrado usuário com a conta institucional '.$request->containstitucional.'.');
}
$authUser = $this->guard()->getProvider()->retrieveById($user->id);
if (!is_null($authUser)) {
// Salvando os cabeçalhos de usuário e de aplicação na sessão
$request->session()->put('applicationBearer', $headers->Application);
$request->session()->put('authorizationBearer', $headers->Authorization);
$this->guard()->login($authUser);
return true;
} else {
throw new \Exception('O usuário de id '.$user->id.' não conseguiu se autenticar');
}
} catch (\Exception $e) {
$errorMessage = $e->getMessage();
$this->sendFailedLoginContaInstitucionalResponse($request, $errorMessage);
}
}
/**
* Get the failed login response instance.
*
* @param \Illuminate\Http\Request $request
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws ValidationException
*/
protected function sendFailedLoginContaInstitucionalResponse(Request $request, String $message)
{
throw ValidationException::withMessages([
$this->username() => [$message],
]);
}
Voltar para Documentação - Integração com a Conta Institucional