Google YouTube API Refresh Token not being sent


Google YouTube API Refresh Token not being sent

我正在尝试根据Google的文档将Google YouTube Data API与PHP一起使用:https://developers.google.com/youtube/2.0/developers_guide_protocol_oauth2#OAuth2_Refreshing_a_Token。使用 OAuth 进行身份验证时出现了我的问题。显然,我正在使用以下授权 URL,该 URL 与文档所说的相同,除了我的重定向 uri 和应用程序密钥。

$this->authorizationUrl = 'https://accounts.google.com/o/oauth2/auth?';
$this->authorizationUrl .= 'client_id=' . $this->applicationKey . '&';
$this->authorizationUrl .= 'redirect_uri=' . $this->redirect_uri . '/account.php?action=youtube_oauth&';
$this->authorizationUrl .= 'scope=https://gdata.youtube.com&';
$this->authorizationUrl .= 'response_type=code&';
$this->authorizationUrl .= 'access_type=offline';

然后,正如文档所说,我 cURL 以下内容:

$curl_options = Array(
            CURLOPT_POSTFIELDS => Array(
                'code' => $code,
                'client_id' => $this->applicationKey,
                'client_secret' => $this->applicationSecret,
                'redirect_uri' => $this->redirect_uri . '/account.php?action=youtube_oauth',
                'grant_type' => 'authorization_code'
            ),
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_URL => 'https://accounts.google.com/o/oauth2/token'
        );

但是,我的回答从来没有像他们的文档所说的那样给我一个refresh_token。我只得到其他三个响应项目。

像这样的一些问题:获取刷新令牌谷歌 API 说使用 approval_prompt=force,但这也不起作用,完全违背了access_type=离线的目的。

关于为什么我会得到 4 个响应项中的 3 个的有效响应的任何想法?

从 OAuth2.0 文档的离线访问部分:

当应用程序收到刷新令牌时,它是 存储该刷新令牌以供将来使用非常重要。如果你的 应用程序丢失刷新令牌,它必须重新提示 用户在获取另一个刷新令牌之前征得同意。如果您需要 若要重新提示用户同意,请包含approval_prompt 参数,并将值设置为 force .

因此,当您已经授予访问权限时,后续对authorization_code grant_type的请求将不会返回refresh_token,即使access_type在同意页面的查询字符串中设置为offline也是如此。

如上面的引用中所述,为了在已经收到新refresh_token后获得,您需要通过提示将用户发送回去,您可以通过将approval_prompt设置为 force 来完成。

干杯

PS 此更改也在博客文章中宣布。

你可以试试谷歌oauth2游乐场(https://code.google.com/oauthplayground/(,看看你的参数和那里有什么区别。