调用Google Analytics API添加用户报403 PERMISSION_DENIED错误如何解决
你遇到的403 PERMISSION_DENIED错误是因为请求使用的Access Token未携带GA用户管理接口所需的授权范围,结合你提供的代码,按以下步骤修复即可:
- 修正Scope的添加时机
你现在把$google_client->addScope('https://www.googleapis.com/auth/analytics.manage.users');放在了curl请求初始化之后,这是错误的。Scope必须在生成Access Token之前声明,你需要把这行代码移动到你调用$google_client->fetchAccessTokenWithAuthCode或者其他获取Access Token逻辑的前面。
如果之前已经完成过授权,需要清除本地存储的旧Access Token和Refresh Token,重新走OAuth授权流程,确保新生成的Token已经包含用户管理权限。 - 确认授权账号的GA权限
你用来发起OAuth授权的Google账号,必须是目标GA账号(ID:203453755)的管理员,且具备用户管理权限,否则即便Scope正确也会触发权限不足报错。 - 修正代码语法和冗余参数
- 你当前代码中
CURLOPT_URL配置行末尾缺少闭合单引号,Authorization请求头配置行末尾也缺少闭合单引号,先修复这两个语法错误。 - GA用户管理接口不需要传递API Key参数,删除URL末尾的
?key=[api key]即可,仅靠Bearer Token就能完成身份校验。
- 你当前代码中
修正后参考代码
<?php include('config.php'); // 注意:addScope要放在获取Access Token之前 $google_client->addScope('https://www.googleapis.com/auth/analytics.manage.users'); // 这里保留你原有生成Access Token的逻辑,确保拿到的是带对应Scope的新Token $access_token = $google_client->getAccessToken(); $ch = curl_init(); // 移除多余的key参数 curl_setopt($ch, CURLOPT_URL, 'https://analytics.googleapis.com/analytics/v3/management/accounts/203453755/entityUserLinks'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "{\"id\":\"id:mailId\",\"kind\":\"analytics#entityUserLink\",\"selfLink\":\"https://www.googleapis.com/analytics/v3/management/accounts/id/entityUserLinks/id:mailId\",\"entity\":{\"accountRef\":{\"id\":\"id\",\"kind\":\"analytics#accountRef\",\"href\":\"https://www.googleapis.com/analytics/v3/management/accounts/id\",\"name\":\"abir test\"},\"webPropertyRef\":{\"id\":\"UA-webproperty\",\"kind\":\"analytics#webPropertyRef\",\"href\":\"https://www.googleapis.com/analytics/v3/management/accounts/id\",\"accountId\":\"id\",\"internalWebPropertyId\":\"id\",\"name\":\"malta\"},\"profileRef\":{\"id\":\"id\",\"kind\":\"analytics#profileRef\",\"href\":\"https://www.googleapis.com/analytics/v3/management/accounts/id\",\"accountId\":\"accountId\",\"webPropertyId\":\"UA-webproperty\",\"internalWebPropertyId\":\"id\",\"name\":\"All Web Site Data\"}},\"userRef\":{\"kind\":\"analytics#userRef\",\"id\":\"userEmailId\",\"email\":\"usermail@gmail.com\"},\"permissions\":{\"effective\":[\"READ_AND_ANALYZE\"],\"local\":[\"READ_AND_ANALYZE\"]}}"); curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); $headers = array(); // 补充闭合单引号,替换为实际拿到的Access Token $headers[] = 'Authorization: Bearer ' . $access_token['access_token']; $headers[] = 'Accept: application/json'; $headers[] = 'Content-Type: application/json'; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'Error:' . curl_error($ch); } echo '<pre>'; var_dump($result,true); curl_close($ch); ?>
内容的提问来源于stack exchange,提问作者Abir
相关产品推荐
相关产品推荐

