Google Calendar API v3 - 使用硬编码凭据进行身份验证

2024-01-19

我正在编写一个 PHP 应用程序,该应用程序应该允许用户将某些事件添加到私人 Google 日历中。该日历归我所有,我需要一种方法让 PHP 使用固定凭据与日历 API 进行通信(每个人都可以使用网站上的表单添加事件,但日历本身不公开可见)。

据我所知,这可以使用 v1 API 中的 ClientLogin 实现。然而,在 v3 API 中,可用选项是 OAuth2.0 或 API 密钥。使用 API 密钥似乎不起作用,因为它只能用于不需要授权的请求,而且 OAuth 似乎也不正确,因为用户不应该访问自己的日历,但我的日历应用程序使用。

我考虑过以编程方式获取 OAuth 令牌,但这迟早会被破坏,因为 OAuth 对话框可以使用验证码。

这似乎是一个标准用例——一个允许用户以某种预定义方式与单个日历交互的 Web 应用程序——但我找不到任何有关如何在 v3 API 中实现此操作的文档。谁能帮我?


我找到了一个解决方案,我认为这是您想做的事情的“官方”。

首先,您必须激活 Google API“已安装应用程序的客户端 ID”。

转到 Google API 控制台并创建项目。

然后,激活日历。

转到“API 访问”选项,然后使用“创建 OAuth 2.0 客户端”按钮。

为产品提供名称(如果需要,还可以提供徽标)。点击下一步”。

选择“已安装的应用程序”选项并单击“创建客户端 ID”。

现在您的访问权限已配置完毕。现在,您将需要一些代码。要获得它们:

*“验证码”。要获取它,您需要以下信息:

SCOPE: https://www.google.com/calendar/feeds/ https://www.google.com/calendar/feeds/(如果您想访问日历 API。还有其他 API,您可以在 OAuth 2.0 Playground 找到它们)

CLIENT_ID:您可以在 Google API 控制台的 API 访问部分找到它。

REDIRECT_URI:在同一个地方获取它。

现在,将以下代码复制到文件中,将值放入变量中,执行代码 (php -q script_name.php),然后转到打印的 URL。

<?php
$scope         =   '';
$client_id      =   '';
$redirect_uri   =   '';

$params = array(
                    'response_type' =>   'code',
                    'client_id'     =>   $client_id,
                    'redirect_uri'  =>   $redirect_uri,
                    'scope'         =>   $scope
                    );
$url = 'https://accounts.google.com/o/oauth2/auth?' . http_build_query($params);        
echo $url."\n";
?>

该网页将要求您允许访问。这样做,您将获得一个代码,这就是您的身份验证代码。

*“刷新代码”。要获得它,您将需要:

您之前使用的数据,加上 API 控制台中“客户端 ID”和“重定向 URI”之间的“客户端密钥”代码。

像之前一样,复制以下代码,并将变量放在适当的位置(代码字段是身份验证代码)。 执行,结果就是“Refresh Token”。

<?php
$url = 'https://accounts.google.com/o/oauth2/token';
$post_data = array(
                    'code'          =>   '',
                    'client_id'     =>   '',
                    'client_secret' =>   '',
                    'redirect_uri'  =>   '',
                    'grant_type'    =>   'authorization_code',
                    );
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);
$token = json_decode($result);

echo $token->refresh_token . "\n";
?>

此时此刻,你已经拥有了你所需要的一切。如果有一天您更改了验证码,请务必小心。您将必须获得新钥匙。

要访问日历服务,这里有示例: 使用前更改变量值。 此示例获取主要日历事件,但您可以更改日历 API 中任何事件的地址 (http://code.google.com/intl/ca/apis/calendar/v3/getting_started.html#background_operations http://code.google.com/intl/ca/apis/calendar/v3/getting_started.html#background_operations)

    <?php
    $scope         =   'https://www.google.com/calendar/feeds/';
    $client_id      =   '';
    $client_secret  =   '';
    $redirect_uri   =   '';


    $refresh_token  =   '';

    $token_url = 'https://accounts.google.com/o/oauth2/token';
    $post_data = array(
                        'client_secret' =>   $client_secret,
                        'grant_type'    =>   'refresh_token',
                        'refresh_token' =>   $refresh_token,
                        'client_id'     =>   $client_id
                        );
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $token_url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $result = curl_exec($ch);
    $token_object = json_decode($result);
    $access_token = $token_object->access_token;

    // Get the results
    $rest_url = 'https://www.googleapis.com/calendar/v3/calendars/primary/events';
    $header = "Authorization: OAuth " . $access_token;

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
    curl_setopt($ch, CURLOPT_URL, $rest_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $rest_result = curl_exec($ch);

    print_r(json_decode($rest_result));
    ?>

首先,该脚本要求提供“访问令牌”,该令牌的有效期为一小时。然后,脚本获取 REST 服务(日历范围内的任何服务),并在标头中发送访问令牌。 为了获得最佳的票据速度,最好将访问令牌存储在缓存中,直到它超过 3600 秒。这样,脚本就可以避免这两个调用之一。

Tips:

访问 OAuth 2.0 Playground 以了解 OAuth 流程中发送的所有信息。这对我帮助很大

埃里克·内格尔(Eric Nagel)在他的博客中发表的一篇文章给了我解决方案。所有的功劳都是他的。我无法链接它,因为我没有足够的“声誉”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Calendar API v3 - 使用硬编码凭据进行身份验证 的相关文章

  • Magento 中的子域 htaccess 问题

    public html www domain com public html subdomain subdomain domain com public html htaccess public html subdomain htacces
  • 如何检查号码是否是巴基斯坦用户的手机号码而不是固定电话号码

    我所做的是从开头删除 92 或 0092 并使用以下代码检查它是否是巴基斯坦人的有效手机号码 if preg match 3 0 4 0 9 number 1 Pakistani mobile number else not a pakis
  • PHPExcel下载文件

    我想下载使用 PHPExcel 生成的 Excel 文件 我按照以下代码PHPExcel 强制下载问题 https stackoverflow com questions 26265108 phpexcel force download i
  • 从 FilterControllerEvent 监听器重定向到另一个 Symfony 路由

    我正在尝试设置一个 kernel controller 侦听器 以便在函数返回 true 时重定向到另一个路由 我有可用的路线 但无法使用此路线设置控制器 event gt setController 我收到以下错误 FilterContr
  • Laravel 5.1 中的VerifyCsrfToken.php 第 53 行:(Firefox 浏览器)中出现 TokenMismatchException?

    我试图找出为什么会出现这个错误 即使它是全新安装的 我在我的项目中遇到了这个错误 所以我用谷歌搜索 没有一个答案对我有用 所以我创建了新项目并复制了所有控制器 视图和模型 几个小时后工作正常 再次出现令牌不匹配错误 为什么在 laravel
  • php表格:每行显示3个单元格[重复]

    这个问题在这里已经有答案了 我看这里 数组放入每行 5 个单元格的表格中 https stackoverflow com questions 9099568 array into a table with 5 cells in each r
  • 覆盖供应商自动加载编辑器

    有没有办法让您创建的自动加载文件在调用供应商自动加载之前运行 我们似乎遇到了 SimpleSAML 的自动加载覆盖我们创建的自动加载文件之一的问题 我是 Composer 的新手 似乎无法在网上找到任何解决方案 我尝试将我们的自动加载文件包
  • 如何将 PHPMailer 与 Codeigniter 3 集成

    嗨 我正在尝试使用PHPMailer 库 https github com PHPMailer PHPMailer来自我的 Codeigniter 应用程序中的 GitHub 我下载了代码并解压到我的application library文
  • Magento补丁安装失败

    从以下位置下载并运行 Magento PHP 5 4 支持补丁 Magento CE v1 7 0 0 1 7 0 2 时http www magentocommerce com download http www magentocomme
  • php 如何统计文件夹中的文件数量?

    我想让用户能够在自己的文件夹中上传一些文件 图片 但只有当该文件夹包含的图片少于五张时才可能 如果已经有 5 张图片 脚本必须让用户知道他 她的文件夹已满 所以 我想知道php中是否有函数可以计算文件夹中的文件数量 或者 php 中有其他方
  • php - 我应该加密电子邮件地址吗?

    当用户注册时 我应该将他们的电子邮件按原样存储在数据库中还是对其进行哈希处理 我希望稍后能够解密 那么我应该使用 md5 吗 谢谢你 No md5 is 单向哈希函数 http en wikipedia org wiki Cryptogra
  • Composer 用于下载私有 GitHub 存储库

    我无法使用 Composer 下载 github 私人存储库 php composer phar update 我收到以下错误 The https api github com repos company private1 https ap
  • PHP 中的 Preg_replace

    我想替换 中包含的字符串中的内容content 它是多行等 preg replace 函数应该删除整个 com 没有垫子 蒙特 尝试这个 result preg replace s replacement content subject
  • 使用日语“Enter”键进行搜索功能

    我在日语方面遇到了问题 我有一个允许用户搜索数据的表单 当用户输入要搜索的字符串并按 Enter 键时 搜索功能就会执行 我的代码是 formSearch input keyup function event var key event c
  • Laravel 5.2 带有可变参数的命名路由用法

    我有这样的路线 Open New Subscription page Route get account subscriptions create menu uses gt Subscriptions SubscriptionControl
  • PHP - hash_pbkdf2 函数

    我正在尝试使用此 php 函数执行一个函数来哈希密码 http be php net manual en function hash pbkdf2 php http be php net manual en function hash pb
  • 通过JS Laravel访问存储目录

    有没有办法访问storage目录 该目录已经链接到publicJS 中的目录 我正在尝试制作一个上传图片的表单 验证脚本 if request gt hasFile photos marker gt photos request gt ph
  • 如何调用 google 的 getBasicProfile() 来仅单击按钮即可登录 google?

    我在我的网站上使用谷歌登录
  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 将数组拆分为特定数量的块

    我知道array chunk 允许将数组拆分为多个块 但块的数量根据元素的数量而变化 我需要的是始终将数组拆分为特定数量的数组 例如 4 个数组 以下代码将数组分为 3 个块 两个块各有 2 个元素 1 个块有 1 个元素 我想要的是将数组

随机推荐

  • javascript能区分左移键和右移键吗?

    大多数情况下 这是一个健全性检查 两个 Shift 键的键码都是 16 这是否意味着浏览器中实际上无法区分左移和右移事件 在较新的浏览器中支持DOM3您可以使用event location检查位置 In DOM3 规范 http www w
  • 安装和导入 SendKeys 时出现问题 -- 更新

    我正在尝试安装适用于 Python 的 SendKeys If I use pip install SendKeys 我收到链接错误 sendkeys c 150 warning C4013 Py InitModule undefined
  • 如何在 TypeScript 中使用回调正确处理 let-variables?

    在使用 TypeScript 期间 我对一种常见的 JavaScript 模式有点挣扎 是关于 声明一些 let 变量而不为其设置任何初始值 在某个回调中将此值设置为变量 执行回调后使用此变量 这是代码示例 const wait cb Fu
  • 最小值应匹配过滤查询

    是否可以有这样的查询 query filtered filter terms names Anna Mark Joe execution and 随着 minimum should match 2 陈述 我知道我可以使用一个简单的查询 我已
  • t-sql 求和时间戳之间的差异

    我正在跟踪机器状态 可以是 0 1 和 2 并将该数据与 time stamp 一起存储在 SQL 表中 我在 sql server 中有一个表 其中包含下一个字段 id 整数 时间戳 日期时间 机器状态 int 机器状态与机器状态相关 m
  • ST_MAKELINE 丢弃重复点,即使不连续

    考虑这个简化的例子 SELECT ST MAKELINE ST GEOGPOINT 5 51 ST GEOGPOINT 5 52 ST GEOGPOINT 5 51 我希望这能构建一条包含三个点的线 并在自身上加倍 相反 我得到的是 LIN
  • Django - Ajax 注册

    我正在尝试允许注册 使用此django registration register http docs b list org django registration 0 8 views html registration views reg
  • 应用程序服务器是否为同一用户的每个请求创建新线程?

    这是一个简单的场景 用户从 Web 应用程序的网页触发某些操作 这项手术是一项繁重的手术 需要更多的时间 在服务器端完成操作之前 用户触发使用一些不同参数的相同操作 因此第二个请求的第二个操作也将开始处理 那么在这种情况下 是否有两个不同的
  • 如何避免 jq 截断长小数

    如何防止 jq 截断长十进制值 例如 echo 18302628978110292481 jq 结果 18302628978110292000 Javascript 不支持这么大的数字 所以也不支持jq 整数大小是2 53 Check th
  • 我们如何在 Angularjs 指令之外使用 $compile

    我想用 compile在函数内的控制器中而不是在指令中 是否可以 我正在尝试下面的代码 compile div Cancel div scope 但这会抛出范围未定义的错误 我试图通过 scope在函数内部 但它不起作用 Angular 如
  • 为什么 Docker 中的 pg_restore 出现段错误?

    我正在 docker 容器内测试 postgres 数据库的备份 恢复过程 我像这样转储我的数据库 docker exec ti my postgres container pg dump Fc U postgres gt db dump
  • d3.js:限制画笔大小

    有没有办法限制画笔的大小 即使范围更大 我制作了一个只有 x 刻度的画笔 可以移动和调整大小 我希望能够限制用户调整大小的范围 基本上仅限于某个点 在以下示例中 当画笔大于最大范围的一半时 画笔函数停止更新 不过 刷子本身仍然可以延长 有没
  • 文本区域的 ngModel 无法在 Angular 2 中工作

    我正在尝试使用在文本区域中打印 json 对象ngModel 我做了以下工作
  • 无法在动态链接库 sfml-graphics-2.dll 中定位过程入口点 _ZSt24__ throw_out_of_range_fmtPKcz

    今天我决定下载 安装并尝试使用 SFML 2 2 我还使用 MinGW 编译器下载了 Code Blocks 我设置了所有内容并正确安装了所有内容 或者我是这么认为的 并尝试运行示例代码以查看它是否有效 include
  • 无法将 Base64 编码的图像添加到 vCard

    我已成功使用 Perl 通过 Embperl 为员工创建动态生成的 vCard 填充除照片之外的所有字段 无论如何我都无法让它发挥作用 生成无照片 vCard 的代码工作正常 根据我在网上找到的信息 图片must在 vCard 本身中进行
  • 使用camelot从PDF中提取表格数据时,未从PDF中提取标题

    我使用camelot进行表数据提取 但是标题没有被提取为PDF的一部分 连接目标 下面的PDF链接和目标表格位于第3页和第4页 需要提取 https drive google com file d 1xniTIwpnNIdA k4xvEAR
  • 将新组件添加到 Rcpp 中的 DatetimeVector

    如果有人可以帮助我将新组件推回到DatetimeVector A DatetimeVector只有开始 结束 getDatetimes和尺寸方法 我想说不要 出于多种原因 AllRcpp 类型使用底层SEXP这需要连续的内存 因此添加单个元
  • 有哪些技术或工具可用于分析 C/C++ 应用程序中过大的代码大小?

    我有一个 C 库 它生成的代码比我真正期望的要大得多 从不到 50K 行的源代码中 我获得了几乎 4 MB 的共享对象和推动 9 的静态存档 这是有问题的 因为库二进制文件非常大 而且更糟糕的是 即使是链接到它的简单应用程序通常也会获得 5
  • Control.GetPreferredSize 方法的目的是什么?

    我正在努力实现一个用户控件 该控件根据某些属性更改其大小 据我了解 winforms 布局引擎在执行布局时会询问每个子控件的首选大小 并告知它们可以承受的最大大小 这是一个描述获取首选尺寸 http msdn microsoft com e
  • Google Calendar API v3 - 使用硬编码凭据进行身份验证

    我正在编写一个 PHP 应用程序 该应用程序应该允许用户将某些事件添加到私人 Google 日历中 该日历归我所有 我需要一种方法让 PHP 使用固定凭据与日历 API 进行通信 每个人都可以使用网站上的表单添加事件 但日历本身不公开可见