我已經使用谷歌的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
讓我知道,如果有任何的不明確,並且可以發佈工作示例來演示。
這似乎像一個堅實的答案,謝謝。 –
這個效果很好,和我現在的情況一樣,我使用php庫for oauth,並調用端點,我不知道如何使用從php到javascript的accesstoken直到現在。我試圖將訪問令牌回顯爲'gapi.auth.setToken',但我現在發現它需要json作爲值。感謝這個人。 – CaffeineShots