调试Youtube Data API中redirect_uri_mismatch错误的下一步方案
我正在尝试通过Youtube Data API获取自有网站视频的字幕,需要实现OAuth2授权机制。目前已经完成授权码兑换访问令牌的前置步骤,但向Google请求令牌时始终出现redirect_uri_mismatch错误。
我已经多次将Google Cloud控制台中的重定向URI复制粘贴到代码中并反复核对,确保完全匹配,但错误依旧。我怀疑是URI输入或标点格式问题,于是用Postman发起请求(该工具会自动处理格式问题),同样复制控制台中的URI,还是无法解决。之后我猜测是浏览器缓存或URI更新延迟,清除浏览器缓存、换Safari测试结果一样,而且修改控制台中的redirect_uri已经超过一天。
请问可能的问题是什么?下一步该如何调试?
Google Cloud控制台中注册的重定向URI:https://dotxav.ownsocial.io/wp-json/youtube/youtube-oauth2-token
我的PHP代码片段:
$ch = curl_init(); $client_secret = $GLOBALS['client_secret']; $client_id = $GLOBALS['client_id']; $redirect_uri = "https://dotxav.ownsocial.io/wp-json/youtube/youtube-oauth2-token"; $url = "https://www.googleapis.com/oauth2/v4/token"; curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array( 'grant_type' => 'authorization_code', 'code' => $code, 'client_id' => $client_id, 'client_secret' => $client_secret, 'redirect_uri' => $redirect_uri ))); $result = curl_exec($ch); curl_close($ch);
一、检查URI的大小写与隐藏字符
Google OAuth2对重定向URI的大小写严格敏感,比如HTTPS与https、路径中的大小写差异都会导致不匹配。另外,要确认URI中没有隐藏的不可见字符(比如全角空格、换行符),可以把代码中的URI复制到纯文本编辑器,和控制台的URI逐字符对比,或者用ASCII码查看工具检查每个字符的编码是否一致。
二、确认OAuth客户端类型与URI类型匹配
在Google Cloud控制台的OAuth 2.0客户端ID设置中,若你创建的是Web应用类型的客户端,必须注册Web类型的重定向URI;如果是其他类型(如桌面应用),重定向URI的规则完全不同。检查你的客户端类型是否正确,对应的URI列表是否准确添加了目标地址。
三、验证授权码对应的重定向URI
授权码是用户授权时,Google根据当时传入的redirect_uri生成的,兑换令牌时的redirect_uri必须和获取授权码时的完全一致。如果获取授权码时的URI和现在兑换令牌的URI有任何差异(比如当时用了不带HTTPS的地址、路径写错),都会触发错误。
调试方法:
- 检查获取授权码的代码中,传入Google授权端点的
redirect_uri参数是否和现在兑换令牌的URI完全相同; - 在获取授权码时,把当时使用的
redirect_uri输出到服务器日志,和当前的地址对比。
四、核对Google Cloud项目与凭据一致性
确保代码中使用的client_id和client_secret,来自于你已经添加了正确重定向URI的那个Google Cloud项目。有时会不小心在多个项目中创建客户端ID,导致代码误用了未配置正确URI的项目凭据。
五、调试请求的实际发送内容
在curl请求中添加日志,输出实际发送的POST参数,确认redirect_uri是否和预期一致:
// 在curl_exec前添加 $postData = http_build_query(array( 'grant_type' => 'authorization_code', 'code' => $code, 'client_id' => $client_id, 'client_secret' => $client_secret, 'redirect_uri' => $redirect_uri )); error_log('POST Data: ' . $postData); // 查看服务器日志
同时捕获curl的响应详情,查看Google返回的错误是否有更具体的提示:
$result = curl_exec($ch); $responseInfo = curl_getinfo($ch); error_log('Response Info: ' . print_r($responseInfo, true)); error_log('Response: ' . $result); curl_close($ch);
六、检查网站的URL重写或代理配置
如果你的网站有URL重写规则(比如WordPress的固定链接设置)、或者使用了CDN/代理服务器,可能导致实际接收请求的URI和你注册的不一致。可以在回调端点(/wp-json/youtube/youtube-oauth2-token)中输出当前请求的实际地址:
error_log('Actual Request URI: ' . $_SERVER['REQUEST_URI']); error_log('Actual Request URL: ' . $_SERVER['HTTP_X_FORWARDED_PROTO'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
如果发现实际URI和注册的不同(比如多了尾部斜杠、被代理改成了HTTP),需要调整注册的URI或者修复服务器配置。
内容的提问来源于stack exchange,提问作者Jackson Wu

