使用youtube API登录并保存信息以备日后使用,如为我的客户上传视频等

使用youtube API登录并保存信息以备日后使用,如为我的客户上传视频等,youtube,youtube-api,google-oauth,youtube-data-api,Youtube,Youtube Api,Google Oauth,Youtube Data Api,下面是代码示例。但是,我无法保存登录用户的信息,系统管理员随后使用API为他上传视频 现在,每次用户必须从谷歌登录并进行身份验证才能获得访问令牌以上传视频等。我想注册一次,然后我可以随时使用信息,用户无需再次从谷歌进行身份验证即可获得会话数据/令牌。 $client->$client->getAccessToken()令牌为我提供 {“访问令牌”:“XXXXXXXXX”,“令牌类型”:“承载者”,“到期日”:3600, “刷新令牌”:“XXXXXXX”,“已创建”:000000} 我想存储/保存

下面是代码示例。但是,我无法保存登录用户的信息,系统管理员随后使用API为他上传视频

现在,每次用户必须从谷歌登录并进行身份验证才能获得访问令牌以上传视频等。我想注册一次,然后我可以随时使用信息,用户无需再次从谷歌进行身份验证即可获得会话数据/令牌。

$client->$client->getAccessToken()令牌为我提供

{“访问令牌”:“XXXXXXXXX”,“令牌类型”:“承载者”,“到期日”:3600, “刷新令牌”:“XXXXXXX”,“已创建”:000000}

我想存储/保存一些信息,如果用户登录或注销,这些信息可供其他人稍后使用

 <?php

    // Call set_include_path() as needed to point to your client library.
    set_include_path($_SERVER['DOCUMENT_ROOT'] . '/directory/to/google/api/');
    require_once 'Google/Client.php';
    require_once 'Google/Service/YouTube.php';
    session_start();

    /*
     * You can acquire an OAuth 2.0 client ID and client secret from the
     * {{ Google Cloud Console }} <{{ https://cloud.google.com/console }}>
     * For more information about using OAuth 2.0 to access Google APIs, please see:
     * <https://developers.google.com/youtube/v3/guides/authentication>
     * Please ensure that you have enabled the YouTube Data API for your project.
     */
    $OAUTH2_CLIENT_ID = 'XXXXXXX.apps.googleusercontent.com';
    $OAUTH2_CLIENT_SECRET = 'XXXXXXXXXX';
    $REDIRECT = 'http://localhost/oauth2callback.php';
    $APPNAME = "XXXXXXXXX";


    $client = new Google_Client();
    $client->setClientId($OAUTH2_CLIENT_ID);
    $client->setClientSecret($OAUTH2_CLIENT_SECRET);
    $client->setScopes('https://www.googleapis.com/auth/youtube');
    $client->setRedirectUri($REDIRECT);
    $client->setApplicationName($APPNAME);
    $client->setAccessType('offline');


    // Define an object that will be used to make all API requests.
    $youtube = new Google_Service_YouTube($client);

    if (isset($_GET['code'])) {
        if (strval($_SESSION['state']) !== strval($_GET['state'])) {
            die('The session state did not match.');
        }

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

    }

    if (isset($_SESSION['token'])) {
        $client->setAccessToken($_SESSION['token']);
        echo '<code>' . $_SESSION['token'] . '</code>';
    }

    // Check to ensure that the access token was successfully acquired.
    if ($client->getAccessToken()) {
        try {
            // Call the channels.list method to retrieve information about the
            // currently authenticated user's channel.
            $channelsResponse = $youtube->channels->listChannels('contentDetails', array(
                'mine' => 'true',
            ));

            $htmlBody = '';
            foreach ($channelsResponse['items'] as $channel) {
                // Extract the unique playlist ID that identifies the list of videos
                // uploaded to the channel, and then call the playlistItems.list method
                // to retrieve that list.
                $uploadsListId = $channel['contentDetails']['relatedPlaylists']['uploads'];

                $playlistItemsResponse = $youtube->playlistItems->listPlaylistItems('snippet', array(
                    'playlistId' => $uploadsListId,
                    'maxResults' => 50
                ));

                $htmlBody .= "<h3>Videos in list $uploadsListId</h3><ul>";
                foreach ($playlistItemsResponse['items'] as $playlistItem) {
                    $htmlBody .= sprintf('<li>%s (%s)</li>', $playlistItem['snippet']['title'],
                        $playlistItem['snippet']['resourceId']['videoId']);
                }
                $htmlBody .= '</ul>';
            }
        } catch (Google_ServiceException $e) {
            $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>',
                htmlspecialchars($e->getMessage()));
        } catch (Google_Exception $e) {
            $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>',
                htmlspecialchars($e->getMessage()));
        }

        $_SESSION['token'] = $client->getAccessToken();
    } else {
        $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">authorise access</a> before proceeding.<p>
    END;
    }
    ?>

    <!doctype html>
    <html>
    <head>
        <title>My Uploads</title>
    </head>
    <body>
    <?php echo $htmlBody?>
    </body>
    </html>

要实现这一点,每次新用户登录到您的应用程序时,都要将
刷新令牌
保存到某个数据库中。现在,每次已经通过身份验证的用户登录时,都会查找具有相同刷新令牌的用户。如果匹配,则使用该
刷新令牌
为用户生成访问令牌。刷新令牌永远不会过期,因此您可以依靠它们对已注册的用户进行身份验证。希望这对你有帮助!!请查看文档中的这条语句

将刷新令牌保存在安全的长期存储中,并在它们保持有效的情况下继续使用它们。限制适用于每个客户机-用户组合和所有客户机中每个用户发出的刷新令牌的数量,这些限制是不同的。如果您的应用程序请求足够的刷新令牌以超过其中一个限制,则旧的刷新令牌将停止工作


要实现这一点,每次新用户登录到您的应用程序时,都要将
刷新令牌
保存到某个数据库中。现在,每次已经通过身份验证的用户登录时,都会查找具有相同刷新令牌的用户。如果匹配,则使用该
刷新令牌
为用户生成访问令牌。刷新令牌永远不会过期,因此您可以依靠它们对已注册的用户进行身份验证。希望这对你有帮助!!请查看文档中的这条语句

将刷新令牌保存在安全的长期存储中,并在它们保持有效的情况下继续使用它们。限制适用于每个客户机-用户组合和所有客户机中每个用户发出的刷新令牌的数量,这些限制是不同的。如果您的应用程序请求足够的刷新令牌以超过其中一个限制,则旧的刷新令牌将停止工作


将刷新令牌保存在响应中,并使用它下次访问其帐户。但它会在一小时左右后自动过期,并存储在浏览器中。我想永久保存信息并由管理员用于管理其帐户。访问令牌在1小时后过期。在用户删除您的访问权限之前,刷新令牌不会过期。当您正在使用的访问令牌过期时,您可以使用刷新令牌请求新的访问令牌。保存刷新令牌,并在管理员需要管理其帐户时请求新的访问令牌在响应中保存刷新令牌,并在下次使用该令牌访问其帐户。但它会在一小时左右后自动过期,并存储在浏览器中,我想永久保存信息,并由管理员用于管理他的帐户访问令牌在1小时后过期。在用户删除您的访问权限之前,刷新令牌不会过期。当您正在使用的访问令牌过期时,您可以使用刷新令牌请求新的访问令牌。保存刷新令牌并在管理员需要管理其帐户时请求一个新的访问令牌hi,上面的代码现在返回(非常奇怪){“访问令牌”:“XXXXX”,“令牌类型”:“Bearer”,“expires_in”:3599,“id_令牌”:“xxxxxxxxx”,“created”:146708014}没有刷新令牌您在url中的请求中使用access=offline吗?请纠正我的错误,我的数据库列长度很小,无法存储刷新令牌,所以为什么省略它:)很好,你帮助了自己:)太好了!!您好,上面的代码现在返回(非常奇怪){“access_token”:“XXXXX”,“token_type”:“Bearer”,“expires_in”:3599,“id_token”:“xxxxxxxxx”,“created”:1467008014}没有刷新令牌您在url中的请求中使用access=offline吗?由于我的错误,我的数据库列长度很小,无法存储刷新令牌,所以为什么被省略:)很好,你帮助了自己:)荣誉!!