加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – OAuth2令牌,消息:当我尝试使用OAuth(服务帐户)更新Googl

发布时间:2020-12-13 17:23:26 所属栏目:PHP教程 来源:网络整理
导读:我正在使用Google Standard Library for PHP来使用日历服务,并且我已通过Google API控制台为OAuth 2.0身份验证设置了服务帐户类型. 我的主要目标是通过批量更新用户的谷歌日历(例如:user@organisationname.com)(当用户不在线时).例如.更新用户日历中的事件.
我正在使用Google Standard Library for PHP来使用日历服务,并且我已通过Google API控制台为OAuth 2.0身份验证设置了服务帐户类型.

我的主要目标是通过批量更新用户的谷歌日历(例如:user@organisationname.com)(当用户不在线时).例如.更新用户日历中的事件.

当用户登录应用程序(使用OAuth2.0)时,他/她将为应用程序提供“管理您的日历”,“查看日历”以及“在我不使用应用程序时执行这些操作”的权限

以下代码用于使用OAuth2.0登录

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

$client = new Google_Client();
$client->setApplicationName("Google Calendar PHP Starter Application");


$client->setClientId('XXXXX-flue2a9o5ll602ovrhaejlpm9otgjh1r.apps.googleusercontent.com');
$client->setClientSecret('XXXXXXXXXX');
$client->setRedirectUri('http://localhost/testAPI/google-api-php-client/examples/calendar/simple.php');
$client->setDeveloperKey('AIzaSyCGvXRXGMo58ZDswyb4zBkJgRMLcHBRIrI');
$cal = new Google_CalendarService($client);
if (isset($_GET['logout'])) {
  unset($_SESSION['token']);
}

if (isset($_GET['code'])) {
  $client->authenticate($_GET['code']);

  $_SESSION['code']=$_GET['code'];

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

if (isset($_SESSION['token'])) {
  $client->setAccessToken($_SESSION['token']);
}

if ($client->getAccessToken()) {
  $calList = $cal->calendarList->listCalendarList();
  print "<h1>Calendar List</h1><pre>" . print_r($calList,true) . "</pre>";

  echo $_SESSION['code'];


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

?>

获得权限后,我必须保存一些东西,以便将来在用户未登录时使用这些权限吗?

用户登录后,以下代码工作正常.但返回错误刷新OAuth2令牌,消息:'{“error”:“access_denied”}’当用户注销时

<?php 

require_once '../src/Google_Client.php';
require_once '../src/contrib/Google_CalendarService.php';

session_start();

const CLIENT_ID = 'XXXXXX.apps.googleusercontent.com';
const SERVICE_ACCOUNT_NAME = 'XXXX@developer.gserviceaccount.com';

const KEY_FILE = 'f183b8caXXXXXXXXatekey.p12';

$client = new Google_Client();
$client->setApplicationName("XXXXXXXX Calendar Service");

if (isset($_SESSION['token'])) {
 $client->setAccessToken($_SESSION['token']);
}

$key = file_get_contents(KEY_FILE);
$client->setClientId(CLIENT_ID);

$client->setAssertionCredentials(new Google_AssertionCredentials(
        SERVICE_ACCOUNT_NAME,array('https://www.googleapis.com/auth/calendar'),$key,'notasecret','http://oauth.net/grant_type/jwt/1.0/bearer','363183053@developer.gserviceaccount.com')
);

$client->setClientId(CLIENT_ID);

$cal = new Google_CalendarService($client);

    try{
$cal->events->quickAdd("info@organisationname.com","SERVICE TEST ");
}catch(Exception $e){

    print_r($e->getMessage());
}

// We're not done yet. Remember to update the cached access token.
// Remember to replace $_SESSION with a real database or memcached.
if ($client->getAccessToken()) {
    echo $_SESSION['token'] = $client->getAccessToken();
}

如果用户未登录(如果用户已授予权限),我该怎么做才能更新日历.我应该在用户登录时保存访问代码,以后在我想运行批处理时使用它吗?

BTW什么是关联处理?

解决方法

由于未正确提及您的范围而导致错误.在Google OAuth 2.0范围内定义:

Indicates the Google API access your application is requesting. The
values passed in this parameter inform the consent page shown to the
user. There is an inverse relationship between the number of
permissions requested and the likelihood of obtaining user consent.

space delimited set of permissions the application requests

>要解决您必须首先更改范围参数的问题>在其中包含日历范围>然后获取访问令牌,然后尝试更改内容>然后根据API文档中提供的要求和步骤进行相应更改

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读