YouTube API v3 和 php 返回“请求未指定任何引用者”
Posted
技术标签:
【中文标题】YouTube API v3 和 php 返回“请求未指定任何引用者”【英文标题】:YouTube API v3 and php returns "The request did not specify any referer" 【发布时间】:2017-06-15 22:31:30 【问题描述】:我有这个 php 代码。
<?php
require 'vendor/autoload.php';
$youtube_api_key = 'MY_KEY';
$playlist_id = 'PL3BE743993147F061';
$client = new \Google_Client();
$client->setDeveloperKey($youtube_api_key);
$youtube = new \Google_Service_YouTube($client);
try
$playlistResponse = $youtube->playlists->listPlaylists('snippet', array(
'id' => $playlist_id
));
echo '<pre>'.print_r($playlistResponse, true).'</pre>';
catch (\Google_Service_Exception $e)
$gse_errors = $e->getErrors();
echo '<h1>error!</h1>';
echo '<pre>'.print_r($gse_errors, true).'</pre>';
如果我没有启用密钥限制,则此代码可以正常工作。但是如果我启用密钥限制它会返回......
请求未指定任何引用者。请确保客户 正在发送 referer 或使用 API 控制台删除 referer 限制。
如何启用密钥限制并使其生效?
我的第二个测试是......
<?php
require 'vendor/autoload.php';
session_start();
$youtube_api_key = 'MY_KEY';
$oauth_client_id = 'MY_CLIENT_ID';
$oauth_client_secret = 'MY_CLIENT_SECRET';
$playlist_id = 'PL3BE743993147F061';
//$client = new \Google_Client();
//$client->setDeveloperKey($youtube_api_key);
$client = new Google_Client();
$client->setClientId($oauth_client_id);
$client->setClientSecret($oauth_client_secret);
$client->setScopes('https://www.googleapis.com/auth/youtube');
$redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'], FILTER_SANITIZE_URL);
$client->setRedirectUri($redirect);
$youtube = new \Google_Service_YouTube($client);
$tokenSessionKey = 'token-' . $client->prepareScopes();
if (isset($_GET['code']))
if (strval($_SESSION['state']) !== strval($_GET['state']))
die('The session state did not match.');
$client->authenticate($_GET['code']);
$_SESSION[$tokenSessionKey] = $client->getAccessToken();
header('Location: ' . $redirect);
if (isset($_SESSION[$tokenSessionKey]))
$client->setAccessToken($_SESSION[$tokenSessionKey]);
try
if ($client->getAccessToken())
$playlistResponse = $youtube->playlists->listPlaylists('snippet', array(
'id' => $playlist_id
));
echo '<pre>'.print_r($playlistResponse, true).'</pre>';
else
// If the user hasn't authorized the app, initiate the OAuth flow
$state = mt_rand();
$client->setState($state);
$_SESSION['state'] = $state;
$authUrl = $client->createAuthUrl();
$htmlBody = <<<END
<h3>Authorization Required</h3>
<p>You need to <a href="$authUrl">authorize access</a> before proceeding.<p>
END;
echo $htmlBody;
catch (\Google_Service_Exception $e)
$gse_errors = $e->getErrors();
echo '<h1>error!</h1>';
echo '<pre>'.print_r($gse_errors, true).'</pre>';
此代码适用于密钥限制,但它要求 所有 用户使用 oAuth 进行身份验证,只是为了查看播放列表和曲目信息,这对任何访问者都不利。
同样的问题。如何启用密钥限制并使其工作? (无需任何访客/用户/访客操作。)
推荐人:
https://developers.google.com/youtube/v3/code_samples/php#set_and_retrieve_localized_playlist_metadata https://developers.google.com/youtube/v3/docs/【问题讨论】:
您是否尝试在 GDC 控制台中的 HTTP 引荐来源网址中指定网站?您也可以使用 * 作为通配符。 @noogui 是的,我做到了。在谷歌 API 管理器中,我已经添加了所有内容,例如 localhost localhost/* localhost localhost* 甚至添加了诸如 . / 之类的内容(但已删除)。 【参考方案1】:这对我有用
$referrer = 'my.domain';
$api_key = 'apikey';
$client = new Google_Client();
$client->setDeveloperKey($api_key);
$headers = array('Referer' => $referrer);
$guzzleClient = new \GuzzleHttp\Client(array( 'curl' => array( CURLOPT_SSL_VERIFYPEER => false, ), 'headers' => $headers ));
$client->setHttpClient($guzzleClient);
更新(描述我是如何从上面得到代码的): 我从 api 请求“请求未指定任何引用者”中收到相同的错误响应。由于环境是本地的,我已经安装了 Charles Web 代理(如存储库指令 https://github.com/google/google-api-php-client/blob/master/README.md 中所述)并检查了请求标头 - 然后我注意到引用标头丢失了。 然后我寻找一种将标头传递给请求的方法,并注意到 Guzzle HTTP 客户端类有一个选项。 我不确定这是否是正确的方法,或者这只是一个 hack,但它对我有用,并希望对某人有所帮助。
【讨论】:
这没有回答问题。 为什么你相信这就是答案? 如何它是如何工作的?简单地告诉某人在没有任何上下文或意义的情况下更改他们的代码不会帮助他们了解他们做错了什么。 对不起,我现在添加了一些信息,我没有告诉任何人使用我的代码,但我理解这个想法。谢谢以上是关于YouTube API v3 和 php 返回“请求未指定任何引用者”的主要内容,如果未能解决你的问题,请参考以下文章
如何在 php 中读取 youtube 数据 api v3 响应
使用 Youtube Data API V3 和 Google API Client PHP 将视频上传到 Youtube - 获取 401(未经授权)消息