Os desenvolvedores Magic xpa já sabem como é fácil gerar relatórios em formato RTF usando a tecnologia MERGE. Falamos também neste post anterior, sobre a possibilidade de se converter automaticamente arquivos RTF em formato PDF. Agora vamos abordar um próximo passo, que se pode dizer, ainda relacionado aos tópicos acima: salvar arquivos na nuvem.
Guardar documentos e relatórios dos sistemas, na nuvem, vem se tornando uma prática cada vez mais comum no ambiente corporativo. Existem vários serviços para esta finalidade, uns pagos e outros gratuitos. Para manter a simplicidade do post, vamos focar apenas em dois serviços gratuitos: Microsoft SkyDrive e Google Drive. O objetivo é guardarmos documentos nestes serviços de armazenamento, usando o Magic xpa. Para que o post não fique muito extenso, vamos abordar primeiramente o Google Drive. O acesso ao Microsoft SkyDrive ficará para uma próxima postagem. Google Drive®
Antes de mais nada, precisamos ter uma conta no Google. É bem provável que já tenhamos uma, dependendo de quais serviços Google somos usuários. Mas se não houver, basta criar uma nova neste endereço.
O Google Drive disponibiliza uma API para que aplicações possam interagir com ele. Esta API faz parte de um conjunto maior de APIs para vários serviços em nuvem da Google, chamada Goggle API Console. Obviamente, uma das tarefas necessárias no uso desta API é a autenticação do usuário do serviço (logon). O Google Drive SDK implementa a autenticação do usuário no serviço através de um protocolo standard, chamado OAuth 2.0. Este é um protocolo muito difundido para autenticação de usuários, usado por exemplo no Facebook, Twitter, LinkedIn, Live (além claro, do Google). Uma das características do OAuth 2.0 é que ele é fácil de implementar em sistemas web, mas nem tanto em sistema desktop. Isso porque o fluxo de autenticação define que a resposta do servidor de autorização deve ser redirecionada a um web Server no domínio do usuário (que está tentando se autenticar/logar), coisa que nem sempre existe numa aplicação essencialmente desktop. Para facilitar a interface com o Magic xpa, adotaremos o fluxo de autenticação chamado de “Concessão de Código de Autorização”. Ele é definido como o mais apropriado para aplicações desktop. Este fluxo possui basicamente os seguintes passos:
- Acessar o servidor de autorização e obter o código de autorização (ACCESS_CODE). Este passo é interativo.
- Acessar o servidor de autorização e trocar o código de autorização (ACCESS_CODE) pelo token de acesso (ACCESS_TOKEN) e pelo token de renovação (REFRESH_TOKEN). Este passo é não-interativo. O ACCESS_TOKEN é uma chave que identifica a sessão que foi aberta no servidor, para o usuário que se autenticou no passo #1. Ela precisa ser informada em todos os acessos subsequentes à API, para que o serviço seja executado na conta certa J. Esta sessão tem tempo de duração limitada, normalmente de 1h (3600s).
- Ao detectar que a sessão expirou, e necessário acessar novamente o servidor de autorização, com o REFRESH_TOKEN obtido no passo #2, e solicitar um novo ACCESS_TOKEN, para poder continuar acessando a API do serviço, sem necessidade de nova autenticação do usuário. Este passo é não interativo.
Quando executamos o passo #1, o servidor de autorização envia o resultado do logon (sucesso ou falha) para o web Server do cliente (através de um redirecionamento de chamada). Quando executamos os passos #2 e #3 a resposta retorna diretamente na chamada HTTP, em formato JSON. Veja mais detalhes aqui. Então, são estes os desafios do exemplo neste post:
- Obter o ACCESS_TOKEN para o servidor do Google Drive
- Ler/Gravar estruturas em formato JSON.
- Fazer upload de arquivos para o disco na nuvem
O Magic xpa possui rotina nativas para trabalhar com formatos XML, mas não para o formato JSON. Mostramos em posts anteriores (aqui e aqui), técnicas para converter um formato em outro, com o Magic xpa. Para o bem da simplicidade do nosso exemplo, usaremos uma biblioteca de terceiro (gratuita) para este trabalho: a NewtonSoft.Json. Ok, então, vamos iniciar os trabalhos. A API do Google Drive (e do Microsoft SkyDrive também) determina que a autorização de acesso deve ser concedida a uma “aplicação” e não a uma “pessoa” diretamente. Por isso, o primeiro passo é termos uma aplicação associada com a nossa conta Live: 1. Acessamos o endereço do site de Gerenciamento de Aplicativos Google:
E criamos um projeto. 2. Habilitamos as APIs que desejamos utilizar:
3. Em seguida, cadastramos o nosso aplicativo:
4. Fazemos alguns ajustes na configuração da Client ID:
Nesta etapa, devemos definir o tipo da aplicação como “Installed” (pois somos uma aplicação desktop). Isso permite ao servidor de autorização do Google usar valores fixos (pré-determinados) como sendo o domínio de redirecionamento, já que não teremos um. Outro detalhe muito importante nesta página é que ela exibe o Id do Cliente (ClientId) e o Segredo do Cliente (ClientSecret) associados à. Estas duas informações são necessárias para podermos obter o ACCESS_TOKEN. Ok. Já temos a conta Google, e uma aplicação associada a ela:
Passemos agora para a programação no Magic xpa. O que é necessário para acessar a API do Google Drive é um ACCESS_TOKEN válido. Se não tivermos um ACCESS_TOKEN, é necessário acionar o servidor de autorização para fazer logon na conta, obter o ACCESS_CODE, e depois trocá-lo pelo ACCESS_TOKEN. Se o tivermos, mas ele estiver expirado, precisamos renová-lo (usando o REFRESH_TOKEN). No programa Magic xpa que construiremos, nós não iremos implementar lógica de renovação de token (REFRESH_TOKEN). Sempre que o ACCESS_TOKEN não existir, ou estiver expirado, faremos outro logon e pediremos um novo. Na vida real, provavelmente a opção de renovação é a melhor. NOTA: Quando instalamos o SkyDrive Desktop ou o Google Drive Desktop, é isso que estas aplicações fazem: solicitam o logon na conta 1 vez (normalmente no primeiro acesso), e depois ficam renovando periodicamente o ACCESS_TOKEN. No projeto Magic xpa, precisamos adicionar alguns assemblies .NET que serão necessários:
Em nosso exemplo, teremos um “cofre” para guardar o ACCESS_TOKEN já recebido e podermos reutilizá-lo enquanto não expirar:
Como as respostas da API virão em formato JSON, precisaremos converter para XML:
Para ler mais facilmente suas informações com a função nativas de XML do Magic xpa: JSON {“error”:”invalid_client”,”error_description”:”The provided request must include a ‘client_id’ input parameter.”} XML
Para o processo de autorização (solicitação do ACCESS_CODE), que é interativo, precisaremos de uma interface com um controle web Browser para acesso ao servidor de autorização do Live:
E monitorar o redirecionamento recebido para saber qual o resultado da solicitação:
Porque definimos nossa aplicação Live como sendo “Installed”, podemos usar o domínio especial urn:ietf:wg:oauth:2.0:oob como sendo o domínio de redirecionamento. A troca do ACCESS_CODE recebido, pelo ACCESS_TOKEN é uma rotina batch normal (não interativa), acessando o servidor Live via HTTPCall:
Já para o upload propriamente dito, usaremos a interface REST da API do GoogleDrive, cfe. descrito aqui:
Ok. Ao executarmos nosso programa exemplo (<<< GoogleDrive Upload >>>), vemos esta tela:
Precisamos informar a localização do arquivo a transferir, o seu respectivo tipo MIME, além no ClientId e ClientSecret da nossa aplicação. Como ainda não possuímos um ACCESS_TOKEN válido, ao clicar em “Transferir” seremos direcionados à tela de autenticação do servidor GoogleDrive:
Informando os dados de logon em nossa conta, o servidor nos leva a página de “Consentimento”:
Ao consentirmos explicitamente (clicando em “Permitir Acesso”), recebemos o ACCESS_CODE e com ele solicitamos então o ACCESS_TOKEN:
E então se inicia o upload:
Pronto! Lá está nosso arquivo (DevProps.txt):
E você pode fazer o teste: fechar e reabrir o Magic xpa. Enquanto o ACESS_TOKEN não tiver expirado, o programa não solicitará novo logon/autenticação e novos uploads podem ser realizados diretamente. Em um ambiente de produção, você provavelmente irá optar por implementar a lógica de refresh automático, para não necessitar novo logon do usuário da conta. Este projeto exemplo, com o Magic xpa 2.2a, está disponível para download neste endereço.