2012-12-04 60 views
5

我想知道,該文檔有幾個語言的實施使用Analytics API的教程。如何在分析API上設置訪問令牌?

現在在PHP中,他們展示瞭如何存儲訪問令牌並對其進行維護,現在我假設JS以某種方式在某種本地存儲中思考它,但是我不希望用戶每次訪問時進行身份驗證,所以我的計劃是在我的數據庫中保存刷新令牌的訪問權限,並簡單地將它應用到客戶端,而不是通過全部彈出處理。

根據教程本:

gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: false}, result); 

火災返回的訪問令牌,但我要再說我是從數據庫submiting令牌intrested彈出。

如何做到這一點?

是否有一些gapi.auth.setToken(token)方法,我可以打電話給核心報告API?

回答

11

我已經使用谷歌的PHP客戶端庫編寫了PHP來完成認證後,我到了這裏尋找一個解決方案。我想要像上面提到的那樣分享存儲的令牌,並且能夠在不重新進行身份驗證的情況下使用javascript,並且/或者觸發彈出窗口(可能有解決方案,使用.init(callback)方法,請參閱文檔/鏈接)。

有一些gapi.auth.setToken(令牌)方法

事實證明就可以了,還有你提到的具體setToken(token)功能,並且,你甚至可以共享身份驗證令牌之前在PHP中生成。什麼我不知道的是,是,如果我們應該做到這一點:)

我使用PHP做初步權威性,但在presumeably JavaScript客戶端你可以調用setToken()上的東西您以本例中的相同方式存儲了getToken()。對此,也可能有更好的方法,比如API身份驗證文檔中提到的CORS(請參閱末尾鏈接),我還沒有機會調查其中的任何一種,但是,我可以舉一個例子來回答這個問題,並可能對需要相同行爲的其他人有用

我首先發現Google開發人員Dan Holevoet的博文中有一些示例JS代碼。

http://googleappsdeveloper.blogspot.com.au/2011/12/using-new-js-library-to-unlock-power-of.html

這是偉大的,能夠直接與JavaScript的查詢API,並動態加載列表等,但擔心我對這門課程的事情是存儲客戶端ID等,在JS ..

// Snippet from Dan's post 
var clientId = 'YOUR_CLIENT_ID'; 
var apiKey = 'YOUR_API_KEY'; 
var scopes = 'https://www.googleapis.com/auth/calendar'; 

function handleClientLoad() { 
    gapi.client.setApiKey(apiKey); 
    window.setTimeout(checkAuth,1); 
    checkAuth(); 
} 

但是,根據丹回答相同的問題:

的apiKey結合使用與指定參照網址,這您必須在API控制檯中聲明 。如果密鑰是從 未經授權的引用者發送的,則它將不起作用。您應該使您的接受的 引用鏈接列表儘可能有限,以確保其他人不會將您的apiKey用於他們自己的請求 。

現在,我的例子是用於日曆API,但它與所有其他API一樣都很相似。

注意:此代碼段僅用於概念驗證目的,可能不應用於生產。我認爲引用保護提到東西這樣可以做,但需要更多的思考。它可以通過隱藏輸入,AJAX調用等完成。但最終,它們都將在javascript中可見。

我所做的測試理念是:

身份驗證通過PHP客戶端庫,使用相同的腳本/ URL回調
  • (參見[API控制檯] [2]這些回調)
  • 在回調中,在頁面中將全局JavaScript變量設置爲存儲的PHP身份驗證令牌
  • 加載頁面後,在您的第一次單擊事件中使用JavaScript(甚至在準備好文檔時),請致電authMe()令牌
  • 然後照常進行,愈傷組織NG你已經在最初的PHP認證過程給定範圍內,以任何JavaScript API方法(在這種情況下makeApiCall()

像這樣:

在PHP回調例程,無論是否認證,但(假設您的回調URL是相同的腳本),使這個全球VAR現在

<script type="text/javascript"> 
    // A place to stick PHP's auth token once the auth dance is done 
    var dodgey_global_access_token = {}; 
</script> 

,在PHP回調例程一旦我們確認,我們正在驗證$_SESSION['token'] = $client->getAccessToken();被稱爲(IE存儲AUTH某處後面的標記),或者至少$client->getAccessToken()有一些有意義的事:

<script type="text/javascript"> 
// Set the js var via PHP here.. Yeck... Note json encode in php and parse in jquery 
dodgey_global_access_token = $.parseJSON (<?php echo json_encode ($client->getAccessToken()); ?>); 
// dodgey_global_access_token now contains the auth token structure 

// Removed auth-related functions in Dan's code - we'll already have a token 

// Dan's orig function to list events in 'primary' calendar 
function makeApiCall() { 
    gapi.client.load('calendar', 'v3', function() { 
    var request = gapi.client.calendar.events.list({ 
     'calendarId': 'primary' 
    }); 

    request.execute(function(resp) { 
     for (var i = 0; i < resp.items.length; i++) { 
     var li = document.createElement('li'); 
     li.appendChild(document.createTextNode(resp.items[i].summary)); 
     document.getElementById('events').appendChild(li); 
     } 
    }); 
    }); 
} 

// My function to setToken with the token injected from PHP authentication 
function authMe() { 
    // Stuff the token into the gapi object 
    gapi.auth.setToken(dodgey_global_access_token); 

    // Now call the original 'makeAPICall' function now that we're 'authenticated' 
    makeApiCall(); 
} 
</script> 

注:我在我的例子來快速解析JSON使用jQuery的,我們已經在使用它的項目,但如果不,你必須找到另一個庫這樣做

相關/有用的文檔:

// Sorry, as a new poster I can only post 2 hyperlinks, 
// so embedding this in code snippet 
// 
// http://code.google.com/p/google-api-javascript-client/wiki/ReferenceDocs#gapi 
// http://code.google.com/p/google-api-javascript-client/wiki/Authentication 
// http://code.google.com/p/google-api-javascript-client/issues/detail?id=22 
// http://code.google.com/p/google-api-javascript-client/wiki/CORS 
// https://code.google.com/apis/console 

讓我知道,如果有任何的不明確,並且可以發佈工作示例來演示。

+0

這似乎像一個堅實的答案,謝謝。 –

+0

這個效果很好,和我現在的情況一樣,我使用php庫for oauth,並調用端點,我不知道如何使用從php到javascript的accesstoken直到現在。我試圖將訪問令牌回顯爲'gapi.auth.setToken',但我現在發現它需要json作爲值。感謝這個人。 – CaffeineShots

0

Google API documentation已經改變了一點,當這個答案第一次被提供時。 google-api-javascript-client不再是推薦的用於訪問google api庫的庫,Google建議使用discovery documents加載特定的庫。 其結果是,你是在爲了尋找工作流程加載所有設置訪問令牌是這樣的庫:

var token = 'someaccesstokenfromoauth2' 
gapi.load('client:auth2', function(){ 
    gapi.client.load(
    'https://analyticsreporting.googleapis.com/$discovery/rest', 
    'v4' 
).then(function(){ 
    gapi.auth.setToken({ access_token: token }) 
    // business logic with gapi.client.analyticsreporting() 
    }) 
}) 

負載GAPI有:

<script src="https://apis.google.com/js/api.js"></script>