无法在 PHP 中刷新 OAuth2 令牌,授权无效

2023-12-08

我需要制作一个 PHP 脚本来在 Google 日历上创建单个事件。 我在设置客户端 ID、客户端密码、开发密钥和创建新事件时没有遇到任何问题。

我唯一的问题是 OAuth2,特别是我需要建立永久连接,并且我不想每次运行脚本时都进行身份验证。

实际上,通过这个脚本,我可以获得一个令牌和一个刷新令牌,但是我的令牌每小时都会过期,我不知道如何刷新它。我如何编辑这段代码来做到这一点? 我可以将令牌和刷新令牌保存在某处并始终使用相同的数据吗?

我收到未捕获的异常“Google_AuthException”,消息为“刷新 OAuth2 令牌时出错,消息:”{“error”:“invalid_grant”

我已经在 stackoverflow 中阅读了有关此主题的其他一些帖子,但我仍然没有找到解决方案...:\

<?php

 require_once 'src/Google_Client.php';
 require_once 'src/contrib/Google_CalendarService.php';
 session_start();

 $client = new Google_Client();
 $client->setApplicationName("Calendar App");
 $client->setClientId('xxxx');
 $client->setClientSecret('yyy');
 $client->setRedirectUri('http://www.zzzzzz');  
 $client->setDeveloperKey('kkk');
 $client->setAccessType('offline');
 $cal = new Google_CalendarService($client);    

if (isset($_GET['logout'])) {
  unset($_SESSION['token']);
}

if (isset($_GET['code'])) {
  $client->authenticate($_GET['code']);
  $_SESSION['token'] = $client->getAccessToken();
  header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']); 
}

if (isset($_SESSION['token'])) {
    //echo $_SESSION['token'];
  //$client->setAccessToken($_SESSION['token']);
    $authObj = json_decode($_SESSION['token']);
    $accessToken = $authObj->access_token;
    $refreshToken = $authObj->refresh_token;
    $tokenType = $authObj->token_type;
    $expiresIn = $authObj->expires_in;
    echo 'access_token = ' . $accessToken;
    echo '<br />';
    echo 'refresh_token = ' . $refreshToken;
    echo '<br />';
    echo 'token_type = ' . $tokenType;
    echo '<br />';
    echo 'expires_in = ' . $expiresIn;
}

if(!empty($cookie)){
    $client->refreshToken($this->Cookie->read('token'));
}

if ($client->getAccessToken()) {
    $calList = $cal->calendarList->listCalendarList();
    $_SESSION['token'] = $client->getAccessToken();
} else {
  $authUrl = $client->createAuthUrl();
  print "<a class='login' href='$authUrl'>Connect Me!</a>";
}


// Creation of a single event
$event = new Google_Event();
$event->setSummary($event_name);            
$event->setLocation('');                    
....

?>

多谢您的支持!


这一页https://developers.google.com/accounts/docs/OAuth2WebServer#offline解释刷新令牌的工作原理,以及如何使用它通过原始 http 获取新的访问令牌。

从这个问题如何使用 Google API 客户端刷新令牌?这是 php 的等价物

here is the snippet to set token, before that make sure the access type should be set to offline

if (isset($_GET['code'])) {
  $client->authenticate();
  $_SESSION['access_token'] = $client->getAccessToken();
}
To refresh token

$google_token= json_decode($_SESSION['access_token']);
$client->refreshToken($google_token->refresh_token);
this will refresh your token, you have to update it in session for that you can do

 $_SESSION['access_token']= $client->getAccessToken()

调试按照以下三个步骤调试任何 oauth 应用程序

  1. 确保您已阅读https://developers.google.com/accounts/docs/OAuth2以及适当的子页面(webapp、javascript 等),具体取决于您使用的 oauth 风格。如果您不了解应用程序在做什么,那么您将无法深入调试应用程序。

  2. 使用 Oauth Playground,位于https://developers.google.com/oauthplayground/完成 Oauth 步骤并最终进行 Google API 调用。这将确认您的理解并向您展示 http 调用和响应的样子

  3. 使用跟踪/日志记录/代理等来跟踪应用程序的实际 http 流量。将其与您在步骤 2 中观察到的情况进行比较。这应该会告诉您问题所在。

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

无法在 PHP 中刷新 OAuth2 令牌,授权无效 的相关文章

随机推荐

  • 将可见性绑定到 DataContext

    我有一个值转换器 可以将 null 转换为 Visibility Collapsed 现在我尝试在用户控件中使用它 以便当 DateContext 为 null 时整个控件会崩溃 该控件如下所示
  • 对多个列使用 CROSS APPLY

    使用 SQL Server 第 3 天 我正在尝试将 2 列分隔数据合并为表值函数的一个输出 这是我的数据 我希望处理数据并将其放入以下格式的表中 我目前trying使用这个 CROSS APPLY SQL 语句 但我不知道我在做什么 US
  • AngularJS - 将 ngTouch 重定向与 ngRoute 一起使用不适用于 href 和 ng-click 属性

    我使用 ngRoute 浏览应用程序 我使用如下链接 a href page2 Link a 由于我使用 ngTouch 导航不适用于触摸设备 我用 Android 手机和 Chrome 的设备模拟器尝试过 在桌面上一切正常 当我删除 ng
  • VSTO WPF ContextMenu.MenuItem 单击未引发的 TaskPane 外部

    当光标位于任务窗格之外时 不会引发上下文菜单项的单击事件 我不知道如何让它发挥作用 90 的情况下 单击是在任务窗格之外进行的 打开上下文菜单时 子菜单通常显示在任务窗格之外 见下图 在这种情况下 不会引发上下文菜单中的单击事件 我完全不知
  • 在scrapy框架python中为start_urls列表中的url构建正则表达式

    我对 scrapy 很陌生 之前也没有使用过正则表达式 以下是我的spider py code class ExampleSpider BaseSpider name test code allowed domains www exampl
  • 为什么同步睡眠函数没有通过在 Promise 中实现异步? [复制]

    这个问题在这里已经有答案了 我正在尝试了解 Promise 以及 JavaScript 如何与其队列和事件循环等一起工作 我认为如果我将一个慢速同步函数放入一个承诺中 该慢速同步函数将被委托给后台 我可以使用 then完成后处理它 func
  • 优化(几乎最小化)jqueryui 菜单的宽度

    我有一个Jqueryui菜单这是在运行时生成的 AJAX 它是生成的 HTML is ul li li li the system li li the agenda li ul 首先 li li 是故意的行分隔符 其他列表项都包含单个单词
  • 从图像 numpy 生成一批克隆

    我有一个numpy数组 图像 称为a这个尺寸 3 128 192 现在我想创建一个 numpy 数组 其中包含n的副本a其尺寸如下 n 3 128 192 是否存在一个 numpy 函数可以在不使用循环指令的情况下帮助我解决这个问题 只需使
  • 在 iPhone 中的 Facebook 上分享捆绑包中的图像和链接

    我想从我的 iPhone 应用程序分享图像 链接等到 Facebook 我的应用程序链接 位置 名称和描述已成功发布 但我无法分享图像 请按照我的代码 UIImage image UIImage imageNamed sample png
  • 在asp.net中使用Http模块配置ETag

    我正在通过 seo 优化和 yslow 来优化我们公司的网站 但在 yslow 中 ETAGS 是 F 我浏览了数十个网站和教程 最好的选择是使用 HTTP 模块 我已经这样做并尝试了几个模块 但没有显示结果 也许语法中的某些内容是错误的
  • 对对象数组中相似的键求和

    我有一个如下所示的对象数组 name P1 value 150 name P1 value 150 name P2 value 200 name P3 value 450 我需要将同名对象的所有值相加 可能还有其他数学运算 例如计算平均值
  • FasterCSV:几个分隔符

    我的 Rails3 应用程序解析用户上传的 CSV 文件 正如预期的那样 用户上传制表符分隔和逗号分隔的文件 我想两者都支持 My code input CSV read uploaded io tempfile encoding UTF
  • 输入文本区域和输出文本区域并保存到

    我编写了一个快速 hta 以便通过按钮进行快速操作 复制到剪贴板 消息框并运行特定文件 现在我正在尝试弄清楚如何添加 2个文本框 TextArea1 在里面输入文本 提交按钮将textarea1保存到本地文件并加载到textarea2 Te
  • 有条件地设置 pandas 数据框列值

    这个问题与下面的请求完全相同 但又多了一个转折 Pandas 替换数据框中的列值 pandas 数据框列中值的条件替换 所以 我想设置或有条件地设置 pandas 数据框列值 增加的复杂性是 不是使用字符串常量来寻址数据帧列 df data
  • 在不同的工作簿中捕捉事件

    我想知道是否可以在另一个工作簿中捕捉事件 宏将打开一个工作簿供用户使用 我希望能够在其选择更改事件上运行另一个宏 不可以 代码不能存储在刚刚打开的工作簿中 除了以编程方式将代码添加到打开的工作簿中之外 还有其他方法吗 ThisWorkboo
  • 从表行发布数据,如 json 格式

    这与我上次有关question 注意 我已经在那里得到了一些很好的答案 我正在做一个可以过滤的程序 我没有包含这个问题 因为我认为只要我知道如何从行中获取数据 添加文本就更容易 但令我沮丧的是 到目前为止我还无法编写出一个好的程序 我目前使
  • 如何组合对一个函数的多次调用?

    我想概括我的函数调用 以便能够将这些调用作为参数传递给第二个函数 就我而言 我有多个 ggplots 我将其存储为列表 例如 year plots lt lapply c 2008 2009 2010 2011 2012 2013 2014
  • 将类静态成员定义放入 cpp 文件 - 技术限制?

    当用 C 编码时 我 最喜欢 的烦恼之一是在我的类中声明一些静态变量 然后查看有关未解析的静态变量的编译错误 在早期 我总是害怕它意味着什么 我的意思是经典的例子 比如 Test h class Test private static in
  • 从代码后面添加文本框服务器控件?

    我正在尝试从代码隐藏添加一个新的文本框服务器控件到我的页面 TextBox txt new TextBox txt Width 100 txt Height 100 Page Controls Add txt 当我编写以下代码时 会引发此错
  • 无法在 PHP 中刷新 OAuth2 令牌,授权无效

    我需要制作一个 PHP 脚本来在 Google 日历上创建单个事件 我在设置客户端 ID 客户端密码 开发密钥和创建新事件时没有遇到任何问题 我唯一的问题是 OAuth2 特别是我需要建立永久连接 并且我不想每次运行脚本时都进行身份验证 实