Google Workspace è una suite di software e strumenti di produttività che l’azienda di Mountain View mette a disposizione di tutti coloro che cercano una alternativa alla piattaforma Office 365.
Include tutta una serie di applicazioni web, tra cui i le più famose sono Gmail, Hangouts, Calendar e Drive.
Probabilmente, anche tu che stai leggendo questo post, avrai usato almeno una di queste applicazioni e sarai d’accordo con me nell’affermare che oggi sono una realtà più che mai consolidata.
Ormai sono moltissime le aziende che hanno deciso di utilizzare Google Workspace come piattaforma di collaboration, quindi nasce spontanea la domanda: Oracle APEX può essere integrato con Google Workspace?
Beh, se sono qui a spiegarlo, potrai immaginare la risposta.
Sì, naturalmente!
Per questo motivo ho intenzione di scrivere una serie di articoli dedicati all’integrazione tra questi due mondi partendo da un’esigenza di integrazione direi molto utile: quella tra Oracle APEX e Google Drive.
In questo articolo scoprirai:
- come configurare un progetto sulla piattaforma Google Cloud
- come collegare Oracle APEX a Google Drive
- come creare una applicazione APEX che visualizza l’elenco dei files archiviati in Google Drive
Sei pronto?
Iniziamo!
IN QUESTO ARTICOLO
Step 1: Crea un Progetto su Google Cloud Platform
La prima cosa da fare per collegare Oracle APEX a Google Drive consiste nell’attivare le API Rest di Google Drive che successivamente andremo a chiamare da Oracle APEX.
In maniera molto simile a quanto serve per implementare l’autenticazione APEX tramite account Google, dovremo creare un progetto sulla Google Cloud Platform ed attivare le API di Google Drive.
- Collegati all’indirizzo https://console.cloud.google.com/ usando il tuo account Google e clicca su My Project

- Dai un nome al progetto e premi Crea

- Dopo qualche secondo dovresti ricevere una notifica che conferma il completamento della procedura.
- Clicca su SELEZIONA PROGETTO.

- Una volta che il progetto è selezionato dovresti vedere il suo nome nella barra degli strumenti

Step 2: Abilita le Google Drive API
Per creare un connettore a Google Drive è necessario attivare le sue API REST.
- Clicca su API e Servizi

- Clicca su ABILITA API E SERVIZI per accedere alla Google API Library

- Seleziona la libreria Google Drive API

- Clicca Abilita API

Step 3: Configura le Credenziali
Per utilizzare le API di Google Drive devi configurare le credenziali che saranno autorizzate ad usare le API.
Normalmente, quando si tratta di applicazioni che devono manipolare i dati e le informazioni di un utente, viene configurato uno schema di autenticazione basato OAuth 2.0.
Un altro modo per integrare i servizi di Google con la tua applicazione APEX è tramite un Account di Servizio che dovrà poi essere autorizzato a manipolare i file gestiti in Google Drive.
In questo tutorial utilizzerò il primo metodo di autenticazione.
- Dopo aver selezionato il progetto, clicca su Credenziali.

- Clicca CREA CREDENZIALI

- A questo punto devi scegliere che tipo di credenziali usare tra le due disponibili. Seleziona il tipo di credenziali ID Client OAuth

- Imposta i seguenti parametri:
- Tipo di Applicazione: Applicazione Web
- Nome: il nome che preferisci

- Vai alla sezioni Origini JavaScript Autorizzate ed URI di Reindirizzamento Autorizzati ed inserisci l’indirizzo principale del tuo Workspace APEX. Facciamo qualche esempio
- Se l’applicazione APEX che vuoi integrare sarà installata su https://apex.oracle.com/ inserirai la stringa https://apex.oracle.com
- Se, invece, stai usando un ambiente privato su Oracle Cloud inserirai l’indirizzo principale del Workspace APEX

- Una volta completata la procedura dovresti avere a disposizione il Client ID e il Client Secret che utilizzeremo più avanti per connetterci a Google Drive

- L’ultima cosa da fare è la configurazione della Schermata consenso OAuth, per la quale ci limiteremo ad un setup minimo.
- Clicca su Schermata consenso OAuth

- Vai alla sezione Informazioni sull’applicazione ed inserisci
- Nome Applicazione
- Email per assistenza utenti

- Vai alla sezione Domini Autorizzati ed inserisci il dominio della tua applicazione APEX. Puoi inserire anche più di un dominio

- Vai alla sezione Informazioni di Contatto dello Sviluppatore ed inserisci la tua email. Clicca SALVA E CONTINUA.

- Per quanto riguarda le sezioni Ambiti, Utenti di Prova e Riepilogo, puoi lasciare i valori di default

Step 4: Crea un Repository su Google Drive
A questo punto possiamo creare un repository in Google Drive per archiviare i files.
Per comodità creerò questo repository all’interno del mio Drive personale, tuttavia potrebbe essere un repository aziendale condiviso con i membri della tua organizzazione
- Accedi a Google Drive
- Se vuoi puoi creare una nuova cartella con il nome che preferisci (io l’ho chiamata APPin5Minuti Drive)

- Carica uno o più file di test nella cartella che hai creato

- Dalla finestra del browser che stai usando per caricare i file nella cartella di Google Drive, posizionati sulla barra degli indirizzi.
- La stringa evidenziata è l’ID della cartella che hai creato: copialo e salvalo in un file di testo perché tra non molto ci servirà

Step 5: Crea una applicazione APEX
Ora che abbiamo creato e configurato il repository Google Drive, possiamo concentrarci nella creazione di una applicazione Oracle APEX che utilizzeremo recuperare i riferimenti ai files.
Potresti integrare questa funzionalità nelle tue applicazioni APEX per recuperare, ad esempio, gli allegati ad una offerta oppure ad un ordine di vendita.
- Accedi ad Oracle APEX ed apri l’APP Builder
- Crea una nuova applicazione che chiamerai Google Drive APP
- In un primo momento limitiamoci a creare una sola una pagina, che chiameremo My Files.

Step 6: Collega Oracle APEX a Google Drive
Questa è una dei punti più delicati di questo esercizio e non nascondo che mi ha fatto faticare un po’.
Inizialmente ho pensato di configurare una origine dati di tipo REST usando questo metodo.
Inutile dire che purtroppo ho fallito miseramente.
Sicuramente ho sbagliato ma non sono stato in grado di capire cosa.
Magari se vuoi puoi farmi sapere nei commenti se anche tu hai avuto lo stesso problema ed eventualmente come lo hai risolto.
Senza farmi prendere troppo dallo sconforto, ho fatto qualche ricerca in rete e finalmente ho trovato questo blog che propone una soluzione promettente per risolvere il problema, basata sull’uso delle librerie JavaScript fornite da Google.
Google API Client Library for JavaScript
OAuth 2.0 è un protocollo standard aperto che consente alle applicazioni di accedere alle risorse protette di un servizio per conto dell’utente con un processo di autorizzazione che in generale può essere descritto nel modo seguente.
- L’applicazione invia all’Authorization Server una richiesta di autorizzazione per accedere ad una risorsa protetta
- Il proprietario della risorsa (di solito, l’utente) concede l’accesso
- L’Authorization Server restituisce un Access Token da utilizzare in tutte le successive richieste come una sorta di “cartellino di riconoscimento”

Le API di Google implementano questo protocollo di autenticazione e a tal proposito Google ha messo a disposizione degli sviluppatori una serie di librerie che possono essere utilizzate per ottenere il token di accesso alle risorse.
Noi utilizzeremo le librerie JavaScript.

A questa pagina puoi trovare i riferimenti alla libreria in questione.
Come includere le librerie JavaScript Google API in una pagina APEX
Quello che dobbiamo fare per usare le api rest di Google Drive è, prima di tutto, recuperare un Access Token.
A tal proposito dobbiamo creare un Page Item che useremo per salvarlo nella sessione di utilizzo dell’applicazione.
- Collegati all’APP Builder e seleziona l’applicazione Google Drive APP
- Seleziona la pagina My Files creata precedentemente
- Crea una Page Region di tipo Static Content con queste proprietà:
- Title: Google Client Region
- Type: Static Content
- Static ID: google-client-region
- Crea un Page Item con queste proprietà:
- Name: P1_GOOGLE_TOKEN
- Type: Display Only
- Crea un Page Button di cui, per il momento, configuriamo solo il nome
- Name: REQUEST_TOKEN
- Static ID: request-token

- Seleziona il nodo radice della pagina e vai alla proprietà JavaScript > File URLs
- Inserisci la seguente entry: https://apis.google.com/js/api.js

Cosa abbiamo fatto esattamente?
Abbiamo incluso nella nostra applicazione APEX le librerie JavaScript di Google.
Adesso possiamo finalmente implementare il codice che si occuperà di recuperare il Token di Autenticazione.
Come ottenere il Token di Autenticazione
- Apri un nuovo file di testo
- Copia il seguente codice JavaScript, all’interno del quale devi valorizzare opportunamente la variabile CLIENT_ID, API_KEY e APP_ID recuperandoli direttamente dal progetto Google.
// Credentials - API keys section
var API_KEY = '***';
// Credentials - OAuth 2.0 Client IDs section
var CLIENT_ID = '***';
// Main menu - Admin - Settings
var APP_ID = '***';
// Scope to use to access user's G Workspace items (Google Drive example) - space delimited
var SCOPES = "https://www.googleapis.com/auth/drive " +
"https://www.googleapis.com/auth/drive.file " +
"https://www.googleapis.com/auth/drive.readonly " +
"https://www.googleapis.com/auth/drive.metadata.readonly " +
"https://www.googleapis.com/auth/drive.appdata " +
"https://www.googleapis.com/auth/drive.metadata " +
"https://www.googleapis.com/auth/drive.photos.readonly ";
// To store Access Token for Google API
var OAUTHTOKEN;
function showErrorMessage(messageText) {
apex.message.showErrors([{
type: 'error',
location: 'page',
message: messageText,
unsafe: false
}]);
}
// Load necessary components
function loadGapiLibraries() {
gapi.load('client:auth2', { 'callback': initAuth2, 'onerror': gapiLoadError });
}
function initAuth2() {
gapi.auth2.init({ 'client_id': CLIENT_ID, 'scope': SCOPES }).then(authInitialized, authError);
}
function gapiLoadError(error) {
showErrorMessage('Error occured while loading library');
}
function authInitialized() {
authInstance = gapi.auth2.getAuthInstance();
authInstance.isSignedIn.listen(updateSigninStatus);
updateSigninStatus(authInstance.isSignedIn.get());
}
function authError(error) {
console.log(error);
showErrorMessage('Error occured while authenticating with Google');
}
// You can adjust the way how sign in state is handled (if-else code)
function updateSigninStatus(isSignedIn) {
if (isSignedIn) {
var user = authInstance.currentUser.get();
var authResp = user.getAuthResponse();
OAUTHTOKEN = authResp.access_token;
// Add APEX item on Page 0 to store Google API Access Token
apex.item('P1_GOOGLE_TOKEN').setValue(OAUTHTOKEN);
$('#request-token').show();
} else {
console.log('User is not logged in');
$('#request-token').show();
}
}
function signIn() {
authInstance.signIn({ scope: SCOPES }).then(signInCallback, signInCallbackError);
}
function signInCallback() {
// your sign in callback
}
function signInCallbackError(error) {
showErrorMessage('Error occured while confirming identity');
}
- Salva il file di testo con il nome google-api-client.js
Prima di andare avanti, ti chiedo solo di prestare un attimo attenzione alla funzione updateSigninStatus(isSignedIn) che esegue le seguenti operazioni:
- Verifica se l’utente è collegato a Google
- Se è collegato recupera il token e lo memorizza nel Page Item che abbiamo creato nella pagina APEX
- Se invece non è collegato, mostra il bottone REQUEST_TOKEN
Questo script è un esempio e ovviamente puoi modificarlo per adattarlo alla tua applicazione come meglio credi.
Per caricare il file JavaScript nell’applicazione APEX
- Vai in Shared Components > Static Application Files
- Clicca Upload File

- Seleziona il file JavaScript google-api-client.js premi Upload

- Dopo aver caricato il file copia la stringa Reference: #APP_IMAGES#google-api-client.js

Ora possiamo includere questa libreria JavaScript nella nostra applicazione
- Vai all’APP Builder e selezionala pagina APEX My Files
- Seleziona il nodo radice e vai alla proprietà JavaScript > File URLs (lo stesso punto dove abbiamo inserito il riferimento alle librerie Google) ed inserisci la stringa #APP_IMAGES#google-api-client.js

- Seleziona il Page Button REQUEST_TOKEN

- Crea una nuova Dynamic Action di tipo Execute JavaScript Code

- Vai alla proprietà dell’Action ed inserisci nel campo Settings > Code la seguente istruzione
signIn();

- Sempre nella pagina My Files, seleziona il nodo radice e vai alla proprietà JavaScript > Execute when Page Loads
- Inserisci la seguente istruzione
loadGapiLibraries();

A questo punto possiamo eseguire l’applicazione.

- Premi Request Token e ti verrà chiesto, se non lo hai già fatto, di collegarti con il tuo account Google

- Se il progetto è ancora in test potresti vedere questo messaggio, clicca su Continua

- Dai le autorizzazioni richieste e clicca Continua

- Nel campo Token dovresti vedere il token di autorizzazione

È importante ricordare che l’Access Token ha una durata massima che è di 3600 secondi, dopodiché dovrà essere rinnovato.
Questo significa che dovrai nella tua applicazione dovresti verificare se il Token è scaduto e in caso affermativo richiederne uno nuovo, magari in modo trasparente per l’utente.
A tal proposito, puoi usare il seguente codice JavaScript
gapi.auth2.getAuthInstance().currentUser.get().reloadAuthResponse()
Step 7: Recuperare i file da Google Drive
Ora che sappiamo come ottenere un Access Token, possiamo finalmente utilizzare le API di Google Drive per recuperare i file dal nostro repository.
Per effettuare questa operazione possiamo utilizzare il seguente script PL-SQL dove:
- P1_GOOGLE_TOKEN è il Page Item in cui abbiamo memorizzato l’Access Token
- P1_OUTPUT_REST è un altro Page Item dove andremo a salvare la response della chiamata REST.
declare
l_clob clob;
begin
apex_web_service.g_request_headers.delete;
apex_web_service.g_request_headers(1).name := 'Authorization';
-- your Access Token in format Bearer/*space*/Access Token
apex_web_service.g_request_headers(1).value := 'Bearer '||:P1_GOOGLE_TOKEN;
l_clob := apex_web_service.make_rest_request(p_url => 'https://www.googleapis.com/drive/v3/files/',
p_http_method => 'GET');
dbms_output.put_line(l_clob);
:P1_OUTPUT_REST := l_clob;
end;
La cosa interessante è visualizzare i files archiviati in Google Drive con un output tabellare.
- Accedi all’APP Builder a vai nella pagina My Files
- Crea una nuova Page Region di tipo Interactive Report: My Files Region

- Inserisci nella definizione dell’Interactive Report la seguente query che utilizza una JSON_TABLE.
select jt.*
from
json_table ( :P1_OUTPUT_REST, '$.files[*]'
columns (
"id" varchar2 ( 4000 ) path '$.id',
"kind" varchar2 ( 4000 ) path '$.kind',
"name" varchar2 ( 4000 ) path '$.name',
"mimeType" varchar2 ( 4000 ) path '$.mimeType'
)
)
jt
- Inserisci nel parametro Page Items to Submit il parametro (che ancora non abbiamo creato) P1_OUTPUT_REST

- Crea un Page Item
- Name: P1_OUTPUT_REST
- Type: Hidden
- Value Protected: No

- Crea un Page Button
- Name: VIEW_FILES
- Assegna al pulsante VIEW_FILES una nuova Dynamic Action
- Name: View Files
- Type: Execute Server-Side Code

- Seleziona l’Action e vai alla proprietà PL/SQL Code. Inserisci il seguente codice PL-SQL
declare
l_clob clob;
begin
apex_web_service.g_request_headers.delete;
apex_web_service.g_request_headers(1).name := 'Authorization';
-- your Access Token in format Bearer/*space*/Access Token
apex_web_service.g_request_headers(1).value := 'Bearer '||:P1_GOOGLE_TOKEN;
l_clob := apex_web_service.make_rest_request(p_url => 'https://www.googleapis.com/drive/v3/files/',
p_http_method => 'GET');
dbms_output.put_line(l_clob);
:P1_OUTPUT_REST := l_clob;
end;
- Inserisci nelle proprietà Items to Submit e Items to Return rispettivamente P1_GOOGLE_TOKEN (il Page Item dove abbiamo salvato l’Access Token) e P1_OUTPUT_REST.
- Esegui la Preview dell’applicazione e premi View Files per visualizzare l’elenco dei files che sono archiviati in Google Drive

La colonna Mime Type ci dice che tipo di oggetto è: ad esempio application/vnd.google-app.folder è una sotto cartella mentre text/plain è un file di testo.
In questo momento l’api restituisce tutti gli oggetti che sono archiviati nel mio Drive personale, tuttavia possiamo passare dei parametri di ricerca per filtrare i risultato.
Ad esempio, possiamo modificare la chiamata per visualizzare tutti e soli i file contenuti all’interno di una specifica cartella, quella che abbiamo creato nello Step 4 di questo tutorial.
A questo link scopriamo che per filtrare i record restituiti dall’API possiamo usare il seguente parametro

Per maggiori dettagli su come usarlo puoi controllare qui.

Senza approfondire troppo, scopriamo che per ottenere la lista di tutti i files contenuti in una specifica cartella possiamo usare il seguente filtro:
parents='<folder_id>'
Per passare un parametro alla chiamata REST puoi usare il seguente script PL-SQL
declare
l_clob clob;
begin
apex_web_service.g_request_headers.delete;
apex_web_service.g_request_headers(1).name := 'Authorization';
-- your Access Token in format Bearer/*space*/Access Token
apex_web_service.g_request_headers(1).value := 'Bearer '||:P1_GOOGLE_TOKEN;
l_clob := apex_web_service.make_rest_request(p_url => 'https://www.googleapis.com/drive/v3/files/',
p_http_method => 'GET',
p_parm_name => apex_util.string_to_table('q'),
p_parm_value => apex_util.string_to_table('parents=''1rMAqd01JVZT_Nhb2Vjqwr-px7k6WzXUA'''));
dbms_output.put_line(l_clob);
:P1_OUTPUT_REST := l_clob;
end;
Questo è il risultato

Conclusioni
In questo tutorial abbiamo visto insieme un modo per integrare Oracle APEX e Google Drive.
Ovviamente possiamo fare tante altre cose come, ad esempio, caricare dei file da Oracle APEX direttamente in Google Drive.
Sono sicuro che l’argomento ti interessa, vero? Fammelo sapere!
Se questo post ti è piaciuto, ti invito a condividerlo con amici e colleghi.
Se poi vuoi rimanere aggiornato ti invito a seguirmi sul mio profilo Twitter e a seguire la pagina LinkedIn di APPin5Minuti per essere aggiornato su tutti gli altri articoli che pubblicherò in futuro.
Bene, direi che per il momento è tutto.
Ti saluto e ti mando un abbraccio
Daniele
Lascia un commento