【问题标题】:Hiding YouTube API for client using server使用服务器隐藏客户端的 YouTube API
【发布时间】:2017-05-13 14:25:12
【问题描述】:

由于缺乏经验,我无法理解如何隐藏 API 密钥。抱歉,由于我专攻关系数据库,我已经离开 Web 开发 15 年了,而且发生了很多变化。

我已经阅读了大量文章,但不知道如何利用它们。我想将我的 YouTube API 密钥放在服务器上,但让客户端能够在不暴露的情况下使用它们。我不明白如何在我的服务器上设置 API 密钥(ISP 提供)使客户端能够访问与项目关联的 YouTube 频道。谁能给我解释一下?

【问题讨论】:

    标签: youtube-api youtube-javascript-api youtube-data-api


    【解决方案1】:

    我不确定你想做什么,但对于我从事的一个项目,我需要从 YouTube 获取特定的播放列表,并将内容公开给网站的访问者。

    我所做的是一种代理。我设置了一个包含 api 密钥的 php 文件,然后让最终用户通过这个 php 文件获取 YT 内容。

    php 文件使用 curl 获取 YT 格式的内容。

    希望对你有帮助。

    编辑 1

    隐藏密钥的方法是将其放在服务器上的 PHP 文件中。 这个 PHP 文件将连接到 youtube 并在您的客户端页面上检索您想要的数据。

    此代码示例,使用正确的 api 密钥和正确的播放列表 id 将获得一个包含播放列表前 10 个曲目的 json 文件。

    $resp 将包含 json 数据。要提取它,必须将其解码为例如关联数组。一旦进入数组,它就可以很容易地混合到将在客户端浏览器上呈现的 html 中。

    <?php        
            $apiKey = "AIza...";
            $results = "10";
            $playList = "PL0WeB6UKDIHRyXXXXXXXXXX...";
    
    
            $request = "https://www.googleapis.com/youtube/v3/playlistItems?part=id,contentDetails,snippet&maxResults=" . $results . 
                       "&fields=items(contentDetails%2FvideoId%2Cid%2Csnippet(position%2CpublishedAt%2Cthumbnails%2Fdefault%2Ctitle))" .
                       "&playlistId=" . $playList . 
                       "&key=" . $apiKey;
    
    
    
            $curl = curl_init();
            curl_setopt_array($curl, array(
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_URL => $request,
                CURLOPT_SSL_VERIFYPEER => false
            ));    
    
            $resp = curl_exec($curl);
    
    
            if (curl_errno($curl)) {
                $status = "CURL_ERROR";
            }else{
                // check the HTTP status code of the request
                $resultStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
                if ($resultStatus == 200) {
                    $status = "OK";
                    //Do something with the $resp which is in JSON format.
                    //Like decoding it into an associative array
                } else {
                    $status = "YT_ERROR";
                }
            }
    
            curl_close($curl);
    ?>
    <html>
    <!-- your html here -->
    </html>
    

    注意:CURLOPT_SSL_VERIFYPEER 设置为 false。这正在开发中。对于 prod 来说应该是真的。

    另请注意,以这种方式使用 api,您可以限制对您的 api 密钥的调用,将它们绑定到您的域。您可以在 googla api 控制台中执行此操作。 (制作提示)

    【讨论】:

    • 猜我没有正确地问这个问题。我有一个客户端页面,在该页面上我从我的 YouTube 频道 gapi.client.setApikey() 构建播放列表列表,然后在我的测试页面上构建 gapi.client.youtube.playlist.list() (现在一切都是本地主机)。这意味着客户端页面公开了 API 密钥。当我转移到 ISP 时,我想将它隐藏在服务器端,但我不明白如何使它与客户端一起工作。
    • 我编辑了我的答案,添加了更多信息和一个您可以扩展的基本示例。
    • 谢谢。我害怕这个。完全有道理。对于我认为非常普遍的需求,这似乎很尴尬,但事实就是如此,而且我还不够聪明,无法找到另一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2015-06-21
    • 2010-10-28
    相关资源
    最近更新 更多