【问题标题】:YouTube OAuth 2.0 - GET Request getting NULL from var_dump();YouTube OAuth 2.0 - GET 请求从 var_dump() 获取 NULL;
【发布时间】:2014-12-17 02:35:26
【问题描述】:

我一直在使用 YouTube OAuth 2.0,但遇到了一些问题。我一直在使用该示例,并且已经到了对 Google 频道进行身份验证并使用代码重定向回来的阶段。

当尝试发送 GET 请求以从 OAuth 范围获取一些通道数据时,我收到“NULL”响应,但我不确定原因。

(验证包含一个工作请求)

echo "<a href='$validate'>Login with Google for advanced analytics</a>";


$channel_data = file_get_contents('https://www.googleapis.com/youtube/analytics/v1/reports?ids=channel%3D%3DMINE&start-date=2014-08-01&end-date=2014-09-01&metrics=views&key={api_key}');
$channel_data = json_decode($channel_data, true);

echo "<br />";
var_dump($channel_data);

它似乎在https://developers.google.com/youtube/analytics/v1/找到的示例请求中工作

【问题讨论】:

  • 我从未使用过分析 api,但是在使用数据 api 时,您需要在查询字符串中发送访问令牌(您编写的代码)(如 http://[...]/?[your arguments]&amp;access_token=[your access token]
  • 在未显示的代码中,这就是 $validate 的含义。
  • 不,$validate 必须是 URL。我的意思是 OAuth 返回一个代码,你必须用它来交换 access_token。此访问令牌必须在 api 请求的 url 中。 (和我上面写的不同,你提到的代码不是访问令牌)

标签: php json oauth-2.0 youtube-api


【解决方案1】:

这似乎是对how to implement OAuth 2.0的误解。

此分步说明是我已链接的网站的摘要:

  1. 在开发者控制台中为 Web 应用程序创建一个客户端 ID
  2. 让您的用户转到授权网址
  3. 当他/她完成该过程后,用户将被重定向到您指定的重定向 uri。
  4. 在此页面上,您的 php 脚本必须获取 code-query ($_GET['code'])
  5. 接下来,您必须向为您提供访问令牌和刷新令牌的页面发出请求(包含代码)。访问令牌在 1 小时后过期,然后您必须使用刷新令牌获取新令牌
  6. 获得访问令牌后,您就可以开始发出 api 请求了

在顶部链接的网站上,您会找到详细说明。 希望这会有所帮助:)


更新

为了交换代币的代码,您必须执行一个发布请求。我认为这不适用于file_get_contents。我建议在这里使用curl

此代码应该适合您,但未经测试:

$url = 'https://accounts.google.com/o/oauth2/token';

$postfields = [
    'code'=>'YOUR_CODE',
    'client_id'=>'YOUR_CLIENT_ID',
    'client_secret'=>'YOUR_CLIENT_SECRET',
    'redirect_uri'=>'YOUR_REDIRECT_URI',
    'grant_type'=>'authorization_code'
];


$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($curl, CURLOPT_POST, count($postfields));
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postfields));

$response = curl_exec($curl);
curl_close($curl);

$response = json_decode($response);

$response 现在是一个关联数组,键为 access_token, token_type, expires_in, refresh_tokentoken_type 始终是 Bearerexpires_in 始终是 3600。另外两个是重要的,你应该安全地存放它们!

您可以在开发者控制台中找到您的客户端 ID 和客户端密码。

但请注意,在此示例中,ssl 验证被禁用。这意味着您的连接不安全。

【讨论】:

  • 惊人的答案。不能听从指示是我的错!就在我开始一个关于 5) 的新问题之前。我不太确定如何使用代码发送请求。没看懂。
  • 请看一下我所做的更新,应该会更清楚。
  • 有没有办法使用 php 做到这一点?即使我的 PHP 版本是 5.6,我仍然从数组 $postfield = "[" 中得到一个错误
  • 什么意思?这是PHP!尝试将其复制并粘贴到空白页面并将var_dump($response); 添加到代码中。当您查看该页面时,您应该得到一个invalid_request-error(因为占位符)。如果发生这种情况,请求工作正常。现在用您的值替换占位符,您将获得令牌。
  • 当我说使用 PHP 时,我的意思是没有 cURL,对不起,我没有让自己足够清楚。即使正确填写了占位符,我也会收到解析错误。
猜你喜欢
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2016-09-14
相关资源
最近更新 更多