我想知道,该文档提供了使用多种语言实现Analytics API的教程。
现在在PHP中他们展示了如何存储访问令牌并维护它,现在我假设JS以某种方式在某种本地存储中保证它,但我不希望用户每次访问时都要进行身份验证,所以我的计划是保存在我的数据库中访问和刷新令牌,只需将其应用到客户端,而不是通过所有弹出的procress。
根据教程:
gapi.auth.authorize({client_id: clientId, scope: scopes, immediate: false}, result);
触发返回访问令牌的弹出窗口,但我再次说我对从数据库提交令牌感兴趣。
怎么办?
是否有一些gapi.auth.setToken(token)
方法,我可以调用Core Reporting API?
我已经使用google的PHP客户端库编写了PHP来执行auth之后,我来到这里寻找解决方案。我想像你提到的那样共享存储的令牌,并且能够使用javascript而无需重新验证,和/或触发弹出窗口(可能有一个使用.init(callback)
方法的解决方案,请参阅末尾的docs / links)。
是否有一些gapi.auth.setToken(令牌)方法
事实证明你可以,你提到的确切的setToken(token)
函数,你甚至可以共享PHP早期生成的auth令牌。我还不确定的是,如果我们应该这样做:)
我正在使用PHP进行初始身份验证,但是假设在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,并动态加载列表等,但当然让我担心的事情是在js中存储clientid等。
// 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中可见。
我为测试这个概念所做的是:
authMe()
来设置令牌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将密码令牌存储在某个地方以供日后使用),或者至少$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>
注意:我在我的示例中使用jquery快速解析JSON,我们已经在项目中使用它,但如果没有,你将不得不找到另一个库来执行此操作
相关/有用的文档:
// 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
如果有任何不清楚的地方,请告诉我,并将工作样本发布到演示中。
Google API documentation从第一次提供此答案时有所改变。 google-api-javascript-client
不再是访问谷歌API库的推荐库,谷歌建议使用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>