2012-12-13 103 views
8

我拼命试图找出我自己的,并不想这个问题来到SO,但我在我的智慧结束(不用感谢api/oauth文档)。谷歌分析API V3/OAuth 2

我正在使用PHP,我试图通过在analytics.data.ga.get方法中使用REST来避免使用Google_ClientAnalyticsService类。

STEP #1: Create an API Project for a Web Application

我去api console,并创建与分析服务项目,并取得OAuth客户端ID和秘密。

我的印象是,我可以为Installed ApplicationWeb Application创建客户端ID,因为我正在手动执行初始令牌握手。如果我错了,请纠正我。

创建Web应用程序的客户端ID,并让我的客户端ID xxxxxxxxxxxxxx.apps.googleusercontent.com,客户端秘密yyyyyyyyyyyyyyy,和我的重定向URI是http://localhost:9002

STEP #2: Request initial API access

我进入这个链接; 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

access_type=offline是因为我正在使用REST,并且不要指望“用户”(我自己)每次需要刷新的令牌时手动处理重定向/弹出窗口。

上述请求返回http://localhost:9002?code=4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI

代码4/KModH0K_xxxxxxxxxxxxxxxxxxx9Iw.gikOaYRDWywTshQV0ieZDArCOX8XdwI是我的权限申请的API令牌。

STEP #3: Request First Token

因为我的公司的IT问题,我被迫使用PHP 5.2.17和我没有访问PHP卷曲,所以我用file_get_contentsstream_context_create

请求第一个标记为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); 

内容参数必须在一行中。

上面的代码返回我JSON格式access_tokenrefresh_token

string(195) "{ "access_token" : "ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro", "token_type" : "Bearer", "expires_in" : 3600, "refresh_token" : "1/8tXvdUKcSEcaaxVqqqqqqqqqqqqqoYpj2KSS9qwWI" }"

刷新令牌,我必须在一个安全的地方存放,如DB或受保护的txt文件,这是在当我的access_token叫已超时。

STEP #4: Request Analytics Data

现在从我个人理解,我已经准备好了,应该能够用我的access_token做出请求https://www.googleapis.com/analytics/v3/data/ga

我通过发送这个请求来做到这一点;

$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); 

此请求返回401 Unauthorized错误。我认为这意味着我的请求已正确组建,并与https://www.googleapis.com/analytics/v3/data/ga建立连接。

另外,根据这个文档Getting Full Quota,我可以在这样的URL做access_token的请求;

$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); 

这次我接收403 error,其中谷歌包含响应User does not have sufficient permissions for this profile

QUESTION #1

上午我缺少的API控制台的东西或一个过程,令牌获取?我假设我没有,因为我最终获得了access_token=ya29和刷新令牌。

QUESTION #2 也许我完全是基于假设我可以做到这一点与简单的https请求?我必须使用Google_ClientAnalyticsService类吗?我不认为这是事实,但也许我错了。

QUESTION #3 我是否需要在我的请求中使用'key'? &key=bbbbbbbbbbbbbbbb

QUESTION #4

通过使用PHP 5.2.17是我失去了一些东西? (除5.3或5.4之外)

例如,在某些版本的PHP中,在stream_context_create中,标头应该位于数组中而不是字符串,如下所示;

$opts = array(
    'http' => array(
     'method' => 'GET', 
     'header' => array(
      'Content-Type: application/x-www-form-urlencoded', 
      'Authorization: Bearer ya29.AHES6wwwwwwwwwwwwwwwVEBXE6XRbC-Q-pP0wZWdoIm9H804ro ' 
     ) 
    ) 
); 

但我不认为这是我的情况的问题。我只是好奇,如果这些HTTP请求需要形成一个不同的方式(不使用卷曲)。

任何见解和想法将不胜感激
+0

难道你看看403 - 权限不足的错误,并确保联合国/ PW使用的是组合访问到配置文件? –

+0

访问令牌需要刷新1小时才能刷新。您是否使用Refresh令牌获得新的Access令牌? –

+0

@jk我不确定你的用户名和密码组合是什么意思。 'access_token'不代表凭证吗?我没有看到文档中的任何地方(除了可能在使用类时)un/pw是必要的。我绝对没有看到简单的获取请求的任何参数。 – bmorenate

回答

13

这是我昏昏沉沉的错误,几乎给我心脏病发作。

我通常在Chrome中做我的开发工作。我的Chrome浏览器已登录到我的Gmail账户[email protected]。不过,我的分析帐户(位于我的[email protected]之下)已在FireFox中打开(尽量不要嘲笑)。

我不是100%确定这是正确的,但我认为这是一般流程。当我做了STEP #2: Request initial API access时,我在我的Chrome浏览器中执行了此操作。端点https://accounts.google.com/o/oauth2/auth正在授权我的[email protected]帐户。我的STEP#4 API请求https://www.googleapis.com/analytics/v3/data/ga正在我的[email protected]帐户下查找分析配置文件。当然哪个不存在。

我从字面上浪费了15个小时。这比试图对更新进行故障排除以及忘记刷新缓存的次数来得多。

对不起,浪费你的时间。

编辑刷新令牌

我再次碰到这个API的问题,并发现了艰辛的道路,遗传算法将撤销刷新令牌,如果太多不同的客户端使用的令牌,至少我认为,是问题。

进一步阅读可以是found here

+0

再加一个分享。我会一直牢记在心;)。 –

+0

谢谢。我不得不再次回到这篇文章,以找出我的这个API的错误。这从来都不容易。 – bmorenate

+0

这些问题在我认为的认证中很常见。也许应该有更好的方法来调试它们。 – elif

10

我今天得到了403个,发现原因:在get函数中,我使用的是账户ID而不是配置文件ID。切换到配置文件ID为我固定它。

+3

是的,这是正确的,它始终是“配置文件ID”,而不是帐户或属性ID(它看起来像“UA-xxx”)。配置文件ID用于特定的网络媒体资源,可以在管理 - >配置文件 - >配置文件设置选项卡中找到,它是一个不带破折号的整数。 – bmorenate

+0

个人资料和视图有什么区别? – nbro

0

这可能是CURL请求的问题。在GoogleAnalyticsAPI.class.php > class Http > function curl (around line 720)增加一个选项来验证对方的证书停止卷曲:

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);