Google Javascript 和 PHP 中的联系人 API

Google Contacts API in Javascript and PHP

我正在制作一个 ajax 控制的网站,我在其中使用 Javascript SDK for Google 来验证我的用户,并获得对他们 google 联系人的访问权限.我打算做的是:

  1. 通过我们的重定向在浏览器中对用户进行身份验证,并请求访问他们的联系人列表,以及管理他们的联系人的权限。
  2. 如果 he/she 授予我访问权限,则将用户 ID 与刷新令牌一起存储在我的数据库中,如果我没记错的话,我只能通过服务器端获取。
  3. 稍后,如果用户想通过我的网站查看他们的 google 联系人,请向我的服务器发送 ajax 请求,服务器向用户请求 access_token,检索数据并将其显示给用户,或者如果用户要求,则将其存储在我自己的数据库中。

我已经成功完成了这三个步骤中的第一步,我可以对用户进行身份验证,并获得对有效期为 3600 小时的单个访问令牌的访问权限,但我不知道如何对用户进行身份验证用户服务器端,无需将他重定向到任何地方。我也尝试使用 Google PHP SDK,但似乎无法弄清楚如何执行此操作。我确信这在某种程度上是可能的,因为它在 Google PHP SDK guide:

如果我们在 Android 或 Javascript 网络客户端上进行了身份验证,我们可能已经通过不同的方式获取了代码。在这种情况下,我们只需要交换它。如果它是通过 gapi Javascript 客户端检索的,我们需要设置重定向 URI postmessage。

  $client->setRedirectUri($redirect_uri);

唯一的问题是我不知道该怎么做。 $redirect_uri 是什么?我没有重定向 url,因为当我实现 Javascript SDK 时,它说我不必使用重定向 uri,因为 Javascript 身份验证已完成在同一个 window 中,没有重定向(正如我想要的那样)。

如何解决上面提到的第二步和第三步?我在哪里可以找到非 hacky 或不是很 hacky 的教程来实现我想要的结果?

编辑:

我主要想实现的是以下几点:

Achieved this with the Javascript SDK

Javascript SDK only grants an access token, and I don't want to pass this via an ajax call, because I feel this is unsecure

这是我的 PHP 文件目前的样子:

$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setScopes('https://www.googleapis.com/auth/plus.me');
$client->setRedirectUri($PHP_SELF);
$client->setState('offline');

$authUrl = $client->createAuthUrl();

if (isset($_GET['code'])) {
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
    $result=$client->getAccessToken();
} else {
    header("Location: ".$authUrl);
    exit;
}

为了实现我想要的,我应该通过 Javascript SDK 以某种方式获取 $_GET['code'] 参数,但我没有诀窍:|

经过几天的头痛之后,我也想出了这个...谢谢 Google 白白感谢,你的文档糟透了。

 $client->setRedirectUri($redirect_uri);

$redirect_uri 参数应该是一个字符串:"postmessage",当通过 javascript 进行身份验证时,您应该要求提供代码而不是令牌,然后将其发送到您的服务器端脚本,用于验证和交换令牌。

  gapi.auth.authorize({client_id: googleApi.clientId, scope: googleApi.scopes, response_type: 'code', immediate: true}, g_handleAuthResult);