无需SSH访问授权Google账号接入Calendar API的实现方法咨询
解决方案
方案1:直接修改官方快速入门脚本,跳过STDIN读取环节
官方默认示例的核心问题是默认通过fgets(STDIN)读取命令行输入的授权码,你硬编码失败大概率是没有跳过原有的交互读取逻辑,按以下步骤修改即可:
原示例中读取授权码的核心逻辑段:
$authUrl = $client->createAuthUrl(); printf("Open the following link in your browser:\n%s\n", $authUrl); print 'Enter verification code: '; $authCode = trim(fgets(STDIN)); // 这行就是读取命令行输入的代码
- 先单独运行生成授权链接的逻辑,拿到有效授权码*(注意授权码有效期仅几分钟,且只能使用一次,拿到后需立刻使用)*
- 注释或删除所有打印授权链接、等待命令行输入的代码,直接给
$authCode赋值你拿到的有效授权码,修改后示例代码:
$authUrl = $client->createAuthUrl(); // 注释以下交互代码 // printf("Open the following link in your browser:\n%s\n", $authUrl); // print 'Enter verification code: '; // $authCode = trim(fgets(STDIN)); // 直接赋值你拿到的授权码 $authCode = '你实际获取到的授权码字符串';
- 运行修改后的脚本即可直接生成
token.json文件,后续调用接口不需要再走授权流程,将生成的token文件存到脚本指定的路径即可正常调用接口。
方案2:硬编码授权码后依然报错的排查点
- 确认授权码未被使用过、未过期:Google OAuth授权码仅可兑换一次token,重复使用或超时都会直接报错
- 确认申请授权码时使用的
client_id、client_secret、授权回调地址和当前脚本配置完全一致,即使回调地址填的是命令行应用专用标识urn:ietf:wg:oauth:2.0:oob也需要完全匹配 - 确认Google Cloud项目中已开启Google Calendar API,且授权账号拥有对应日历的访问权限
- 如果你拿到的授权码是URL编码后的,先做URL解码再赋值:
$authCode = urldecode('你拿到的授权码');
方案3:完全脱离命令行的授权流程改造
如果需要后续多次给不同用户授权,可直接改造为网页交互授权流程,完全不需要命令行操作:
- 第一步:用户访问授权脚本时如果没有有效token,直接跳转至Google授权页
- 第二步:用户授权后会跳转至你指定的回调地址,回调地址的GET参数
code即为授权码 - 第三步:直接用该授权码兑换token,存储到服务器或用户会话中即可
核心示例代码:
session_start(); $client = new Google\Client(); $client->setClientId('你的client_id'); $client->setClientSecret('你的client_secret'); $client->setRedirectUri('你的回调地址,例如https://你的域名/callback.php'); $client->addScope('https://www.googleapis.com/auth/calendar'); if (!isset($_GET['code'])) { // 无授权码则跳转至授权页 $auth_url = $client->createAuthUrl(); header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL)); } else { // 拿到授权码直接兑换token $token = $client->fetchAccessTokenWithAuthCode($_GET['code']); $client->setAccessToken($token); // 存储token到文件或数据库,后续调用接口直接读取即可 file_put_contents('token.json', json_encode($token)); echo "授权完成,token已保存"; }
内容的提问来源于stack exchange,提问作者Jan Arend
相关产品推荐
相关产品推荐

