Desenvolva aplicações utilizando a linguagem php e integre com as API's da UFVJM


Codigos de exemplo em como integrar com as API's da UFVJM utilizando a linguagem php

php - Exemplos

Implementação em PHP

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