Ho cercato disperatamente di capirlo da solo, e non volevo venire a SO con questa domanda, ma sono alla fine (no grazie all'api/oauth docs).API di Google Analytics V3/OAuth 2
Sto lavorando in PHP e sto cercando di evitare di utilizzare le classi Google_Client
e AnalyticsService
utilizzando REST nel metodo analytics.data.ga.get
.
STEP #1: Create an API Project for a Web Application
vado al api console e creare un progetto con servizi di analisi e ottenere un ID client OAuth e segreto.
Ho l'impressione di poter creare un ID cliente per un Installed Application o un Web Application perché sto eseguendo manualmente l'handshaking token iniziale. Per favore correggimi se sbaglio.
ho creare un ID client per le applicazioni web e ottenere il mio ID cliente xxxxxxxxxxxxxx.apps.googleusercontent.com
, client segreto yyyyyyyyyyyyyyy
, e il mio Redirect URI è http://localhost:9002
STEP #2: Request initial API access
entro in questo link; https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=xxxxxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http://localhost:9002&scope=https://www.googleapis.com/auth/analytics.readonly&access_type=offline
Il access_type=offline
è perché sto utilizzando REST, e non si aspettano "l'utente" (io) per affrontare manualmente con reindirizzamenti/popup ogni volta che ho bisogno di un token rinfrescato.
La richiesta di cui sopra torna http://localhost:9002?code=4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI
Codice 4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI
è il mio permesso di richiedere l'API Token.
STEP #3: Request First Token
A causa di problemi informatici della mia azienda, sono costretto a utilizzare PHP 5.2.17 e io non avere accesso a PHP cURL, quindi sto usando file_get_contents
e stream_context_create
.
Il primo token è richiesto con un PHP file_get_contents()
;
$opts = array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => 'code=4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI&client_id=xxxxxxxxxxxxxx.apps.googleusercontent.com&client_secret=yyyyyyyyyyyyyyy&redirect_uri=http://localhost:9002&grant_type=authorization_code'
)
);
$context = stream_context_create($opts);
$result = file_get_contents('https://accounts.google.com/o/oauth2/token', false, $context);
var_dump($result);
I parametri del contenuto devono essere in un'unica riga.
Il codice di cui sopra restituisce la mia access_token
e refresh_token
in formato JSON
string(195) "{ "access_token" : "ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro", "token_type" : "Bearer", "expires_in" : 3600, "refresh_token" : "1/8tXvdUKcSEcaaxVqqqqqqqqqqqqqoYpj2KSS9qwWI" }"
Il token di aggiornamento devo conservare in un luogo sicuro, come un DB o file txt protetta, che viene chiamato quando il mio access_token è scaduto.
STEP #4: Request Analytics Data
Ora da quanto ho capito, sono pronto a rotolare e dovrebbe essere in grado di usare i miei access_token
per effettuare richieste a https://www.googleapis.com/analytics/v3/data/ga
.
Faccio questo inviando questa richiesta;
$request = 'https://www.googleapis.com/analytics/v3/data/ga' .
'?ids=ga%3Aaaaaaaaa' .
'&start-date=2012-12-07' .
'&end-date=2012-12-09' .
'&metrics=ga%3Avisits';
$opts = array(
'http' => array(
'method' => 'GET',
'header' => 'Content-Type: application/x-www-form-urlencoded\r\n' .
'Authorization: Bearer ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro \r\n'
)
);
$context = stream_context_create($opts);
$result = file_get_contents($request, FALSE, $context);
var_dump($result);
Questa richiesta restituisce un errore 401 Unauthorized
. Prendo questo nel senso che la mia richiesta è correttamente formata e che effettua la connessione a https://www.googleapis.com/analytics/v3/data/ga
.
Inoltre, in base a questo documento Getting Full Quota, posso effettuare la richiesta con l'access_token
nell'URL come questo;
$request = 'https://www.googleapis.com/analytics/v3/data/ga' .
'?ids=ga%3A48564799' .
'&access_token=ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro' .
'&start-date=2012-12-07' .
'&end-date=2012-12-09' .
'&metrics=ga%3Avisits';
$result = file_get_contents($request, FALSE);
$result = json_decode($result);
var_dump($result);
Questa volta che ricevo 403 error
, in cui Google include la risposta User does not have sufficient permissions for this profile
.
QUESTION #1
Am che mi manca qualcosa nella console API o un processo per l'acquisizione gettone? Suppongo di non esserlo, perché in definitiva sto acquistando lo access_token=ya29
e il token di aggiornamento.
QUESTION #2
Forse sono completamente fuori di testa nel presupporre che posso farlo con semplice https reqests? Devo utilizzare le classi Google_Client
e AnalyticsService
? Non penso che sia così, ma forse mi sbaglio.
QUESTION #3
Devo utilizzare una "chiave" nella richiesta? &key=bbbbbbbbbbbbbbbb
QUESTION #4
Utilizzando PHP 5.2.17 mi sto perdendo qualcosa? (oltre a 5.3 o 5.4 stessi)
Ad esempio, in alcune versioni di PHP, in stream_context_create
, l'intestazione deve essere in una matrice e non in una stringa, come questa;
$opts = array(
'http' => array(
'method' => 'GET',
'header' => array(
'Content-Type: application/x-www-form-urlencoded',
'Authorization: Bearer ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro '
)
)
);
Ma non penso che sia un problema nel mio caso. Sono solo curioso di sapere se queste richieste HTTP devono essere formate in modo diverso (senza usare il ricciolo).
Qualsiasi intuizione e opinione sarebbe molto apprezzata
Forse si guarda nel 403 - errore di autorizzazioni insufficienti e assicurarsi che l'ONU/pw combo che si sta utilizzando ha accesso al profilo? –
I token di accesso durano un'ora prima che debbano essere aggiornati. Stai ricevendo un nuovo token di accesso con il token di aggiornamento? –
@jk Non sono sicuro di cosa intendi per nome utente e password combo. Il 'access_token' non rappresenta le credenziali? Non ho visto da nessuna parte nei documenti (oltre forse quando si usano le classi) che un/pw è necessario. Non ho assolutamente visto alcun parametro per richieste di ottenere semplici. – bmorenate