Javascript和PHP中的Google Contacts API

时间:2015-06-15 11:32:23

标签: google-api google-api-php-client

我正在建立一个受ajax控制的网站,我在其中使用Google的Javascript SDK对我的用户进行身份验证,并获得对其Google联系人的访问权限。我打算做的是以下几点:

  1. 在浏览器中对用户进行身份验证,同时重定向并要求访问其联系人列表,以及管理其联系人的权限。
  2. 如果他/她授予我访问权限以及刷新令牌,则将用户ID存储在我的数据库中,如果我没有误会,我只能通过服务器端获取。
  3. 稍后,如果用户希望通过我的网站查看他们的Google联系人,请向我的服务器发送ajax请求,ASKS向用户发送access_token,检索数据并将其显示给用户,或将其存储在如果用户要求,我自己的数据库。
  4. 我已经成功完成了这三个步骤的第一步,我可以对用户进行身份验证,并可以访问一个有效期为3600小时的访问令牌,但我无法弄清楚如何验证用户服务器端,而无需将其重定向到任何地方。我也试过使用谷歌PHP SDK,但似乎无法弄清楚如何做到这一点。我确信这在某种程度上是可能的,因为它在Google PHP SDK guide

    中有说明

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

      $client->setRedirectUri($redirect_uri);
    

    唯一的问题是我不明白该怎么做。什么是$ redirect_uri?我没有重定向网址,因为当我实施Javascript SDK时,它说,我不必使用重定向uri,因为Javascript验证是在同一个窗口中完成的,没有重定向(就像我想要的那样)。

    我怎样才能解决上面提到的第二步和第三步?我在哪里可以找到一个非hacky或非常非常hacky的教程来实现我想要的结果?

    修改

    我基本上想要实现的目标是:

    • 要求获得用户访问Google通讯录的权限,不要将其从我的网站重定向(通过弹出窗口)
      

    使用Javascript SDK

    实现了这一目标
    • 获取此权限的访问令牌和刷新令牌,并将其存储在数据库中
      

    Javascript SDK只授予访问令牌,我不想通过ajax调用传递它,因为我觉得这是不安全的

    • 使用刷新令牌,为用户生成访问令牌服务器端,处理数据,然后将数据发回。

    以下是我的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 ['代码'] 参数,但我不知道如何:

1 个答案:

答案 0 :(得分:1)

经过几天的头痛之后我也想出了这个......感谢谷歌什么都没有,你的文件很麻烦。

 $client->setRedirectUri($redirect_uri);

$ redirect_uri参数应该是一个字符串:“postmessage”,当通过javascript进行身份验证时,你应该要求代码而不是TOKEN,然后将其发送到服务器端脚本,进行身份验证并交换令牌

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