如何在分析API上设置访问令牌?

时间:2012-12-04 14:05:28

标签: javascript google-analytics google-analytics-api

我很想知道,该文档提供了使用多种语言实现Analytics API的教程。

现在在PHP中他们展示了如何存储访问令牌并对其进行维护,现在我假设JS以某种方式在某种本地存储中保证它,但我不希望用户每次访问时都要进行身份验证,所以我的计划是保存访问权限刷新我的数据库中的令牌,只需将其应用到客户端,而不是通过所有弹出的procress。

根据教程:

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

触发返回访问令牌的弹出窗口,但我再次说我对从数据库提交令牌感兴趣。

怎么办呢?

是否有一些gapi.auth.setToken(token)方法,我可以调用Core Reporting API?

2 个答案:

答案 0 :(得分:11)

我来到这里寻找一个解决方案,在使用google的PHP客户端库编写PHP以进行身份​​验证之后使用它。我想按照你提到的方式共享存储的令牌,并且能够使用javascript而无需重新进行身份验证,和/或触发弹出窗口(可能有一个使用.init(callback)方法的解决方案,请参阅docs / links at端)。

  

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

事实证明你可以,你提到了确切的setToken(token)函数,你甚至可以共享之前在PHP中生成的auth令牌。我还不确定的是,如果我们应该这样做:)

我正在使用PHP进行初始身份验证,但是在javascript客户端中,您可以使用setToken()以与getToken()存储的内容相同的方式调用// 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(); } 这个例子。也许有更好的方法,比如API认证文档中提到的CORS(参见最后的链接),我还没有机会调查其中的任何一个,但是,我可以举一个例子来回答这个问题,并且可能对需要相同行为的其他人有用

我首先使用一些示例JS代码找到了谷歌开发人员Dan Holevoet的博文。

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

很高兴能够直接使用javascript查询API,并动态加载列表等,但当然让我担心的事情是在js中存储clientid等。

authMe()

但是,据Dan在回答同一个问题时说:

  

apiKey与指定的推荐人一起使用   必须在API控制台中声明。如果密钥是从一个发送的   未经授权的推荐人,它将无法正常工作。你应该让你接受   推荐人名单尽可能有限,以确保其他人不使用   你的apiKey是他们自己的要求。

现在,我的示例是针对日历API,但它似乎与其他API非常一致。

注意:此代码段仅用于概念验证目的,可能不应在生产中使用。我认为提到的引荐来源保护使某事像这样做可以,但需要更多的思考。它可以通过隐藏输入,AJAX调用等来完成。但最终,它们都将在javascript中可见。

我为测试这个概念所做的是:

  • 通过PHP客户端库进行身份验证,使用与回调相同的脚本/ URL(有关这些回调,请参阅[API控制台] [2])
  • 在成功的身份验证中,在回调中,将页面中的全局javascript变量设置为存储的PHP身份验证令牌
  • 加载页面后,在第一次点击事件中使用javascript(甚至在准备文档中),请致电makeApiCall()设置令牌
  • 然后正常进行,在初始PHP身份验证过程中调用您已为其提供范围的任何JavaScript API方法(在本例中为<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回调例程中,无论是否已经过身份验证(假设您的回调URL是相同的脚本),请将此变量设为全局

$_SESSION['token'] = $client->getAccessToken();

现在,在php回调例程中,一旦我们检查到我们已经过身份验证,并且$client->getAccessToken()已被调用(IE将auth令牌存储在某个地方以供日后使用),或者至少<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> 有一些有意义的东西:

// 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

注意:我在我的示例中使用了jquery来快速解析JSON,我们已经在项目中使用它,但如果没有,你将不得不找到另一个库来执行此操作< / p>

相关/有用的文档:

{{1}}

如果有任何不清楚的地方,请告诉我,并将工作样本发布到演示中。

答案 1 :(得分:1)

从第一次提供此答案时,

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>