调用Google REST API发送短信出现ADMIN_ONLY_OPERATION错误如何处理
错误原因
accounts:sendVerificationCode属于Google Identity Platform的管理员级操作接口,仅允许使用服务账号+管理员权限凭据调用,你当前直接拼接在URL中的普通Web API密钥没有调用该接口的权限,所以触发了管理员操作限制报错。- 额外可能触发该错误的原因:你使用的Google Cloud项目没有开启电话号码验证功能,或者API密钥配置了拦截规则导致请求被拒绝。
解决方法
更换鉴权方式
不要用普通Web API密钥调用该接口,需要先在Google Cloud控制台创建对应项目的服务账号,给服务账号授予Firebase Authentication Admin角色,生成服务账号的JSON密钥文件,使用服务账号的OAuth 2.0凭据发起请求。推荐使用官方Admin SDK替代手动cURL
直接使用封装好的Firebase Admin SDK for PHP实现,避免手动处理鉴权、参数格式的错误,实现逻辑参考:
// 先通过composer安装依赖:composer require kreait/firebase-php use Kreait\Firebase\Factory; $factory = (new Factory) ->withServiceAccount('/path/to/你的服务账号密钥.json'); $auth = $factory->createAuth(); // 发送验证码 $phoneNumber = '+6512341234'; $sessionInfo = $auth->startPhoneNumberVerification($phoneNumber); // sessionInfo可以存储下来,后续用户提交验证码后用于校验 var_dump($sessionInfo);
- 如果需要手动实现cURL请求,按以下规则调整代码
首先获取服务账号的Access Token,权限范围设置为https://www.googleapis.com/auth/firebase,再调整请求参数格式和请求头:
$data = [ 'phoneNumber' => '+6512341234' ]; $accessToken = '你获取到的服务账号Access Token'; $verify = curl_init(); curl_setopt($verify, CURLOPT_URL, "https://identitytoolkit.googleapis.com/v1/accounts:sendVerificationCode"); curl_setopt($verify, CURLOPT_POST, true); curl_setopt($verify, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($verify, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $accessToken, 'Content-Type: application/json' ]); curl_setopt($verify, CURLOPT_SSL_VERIFYPEER, true); // 生产环境不要关闭SSL验证 curl_setopt($verify, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($verify); var_dump($response);
- 检查后台配置
进入对应Firebase项目的Authentication控制台,在「登录方式」页开启「电话号码」登录提供商,确认你的服务账号权限、API密钥的访问限制配置无误。
内容的提问来源于stack exchange,提问作者4 Leave Cover
相关产品推荐
相关产品推荐

