使用PHP的Google URL缩短API



现在我知道这是一个普遍的话题,特别是在互联网上的StackOverflow。但是我没有(或者还没有看到)的是在会话中维护令牌的直接解决方案。

我正在使用Google api Client Library for PHP。

我查询:

我有一个index.php,其中我使用Google_Oauth2Service从PHP客户端库获取用户数据(例如名称)。用户身份验证成功,一切正常。现在我想使用URL缩短服务,因此我有一个缩短。php在那里我有代码来尝试获取短URL。

index . php

//include google api files
require_once 'src/Google_Client.php';
require_once 'src/contrib/Google_Oauth2Service.php';
require_once 'src/contrib/Google_UrlshortenerService.php';
//start session
session_start();
$gClient = new Google_Client();
$gClient->setApplicationName('Test App');
$gClient->setClientId($google_client_id);
$gClient->setClientSecret($google_client_secret);
$gClient->setRedirectUri($google_redirect_url);
$gClient->setDeveloperKey($google_developer_key);
$google_oauthV2 = new Google_Oauth2Service($gClient);
....
....
在这里,我已经启动了会话,并创建了一个Google_Client对象。我已经声明了客户端id, secret和所有其他细节。

然后我在成功的身份验证上获得访问令牌并将其存储在Session变量中,以便当我尝试从short .php获取短url(使用jQuery ajax)时,我可以使用现有的令牌。

$_SESSION['token'] = $gClient->getAccessToken();    
....

现在在short .php

session_start();
require_once 'src/Google_Client.php';
require_once 'src/contrib/Google_Oauth2Service.php';
require_once 'src/contrib/Google_UrlshortenerService.php';
$gClient = new Google_Client();
$gClient->setApplicationName('Test App');
$gClient->setClientId($google_client_id);
$gClient->setClientSecret($google_client_secret);
$gClient->setRedirectUri($google_redirect_url);
$gClient->setDeveloperKey($google_developer_key);
....
if (isset($_SESSION['token']) && $_SESSION['token']) {
    // Set the access token from the session
    $gClient->setAccessToken($_SESSION['token']);   
    $url_service = new Google_UrlshortenerService($gClient);
    // Check if a URL has been passed
    if (isset($_GET['url'])) {  
            $url = new Google_Url();
        $url->longUrl = $_GET['url'];
        $shortURL = $url_service->url->insert($url);    
            ....

这是代码中断的确切行$shortURL = $url_service->url->insert($url); I成功地使用Session变量获得令牌并创建了一个成功的URL服务对象。但是当我调用插入方法时,它就失败了

来自apache错误日志:

husain@innovate:~/myprojects/web$ tail -1 /var/log/apache2/error.log | sed -e 's/\n/n/g'
[Thu Mar 28 00:42:35 2013] [error] [client 127.0.0.1] PHP Fatal error:  Uncaught exception 'Google_ServiceException' with message 'Error calling POST https://www.googleapis.com/urlshortener/v1/url?key=AIzaSyCxfXP-xS-QYJw-7mM4SNG3EW9ryj_Oiv4: (401) Invalid Credentials' in /home/husain/myprojects/web/apps/src/io/Google_REST.php:66
Stack trace:
#0 /home/husain/myprojects/web/apps/src/io/Google_REST.php(36): Google_REST::decodeHttpResponse(Object(Google_HttpRequest))
#1 /home/husain/myprojects/web/apps/src/service/Google_ServiceResource.php(177): Google_REST::execute(Object(Google_HttpRequest))
#2 /home/husain/myprojects/web/apps/src/contrib/Google_UrlshortenerService.php(38): Google_ServiceResource->__call('insert', Array)
#3 /home/husain/myprojects/web/apps/shorten.php(44): Google_UrlServiceResource->insert(Object(Google_Url))
#4 {main}
  thrown in /home/husain/myprojects/web/apps/src/io/Google_REST.php on line 66

当我将Google_Client变量转储到index.php和short .php文件时,得到的结果如下:

index . php

Google_Client Object
    (
    [scopes:protected] => Array
        (
        )
    [useObjects:protected] => 
    [services:protected] => Array
        (
            [oauth2] => Array
                (
                    [scope] => Array
                        (
                            [0] => https://www.googleapis.com/auth/userinfo.profile
                            [1] => https://www.googleapis.com/auth/userinfo.email
                        )
                )
        )
    [authenticated:Google_Client:private] => 
)

shorten.php

object(Google_Client)#1 (4) {
  ["scopes":protected]=>
  array(0) {
  }
  ["useObjects":protected]=>
  bool(false)
  ["services":protected]=>
  array(1) {
    ["urlshortener"]=>
    array(1) {
      ["scope"]=>
      string(44) "https://www.googleapis.com/auth/urlshortener"
    }
  }
  ["authenticated":"Google_Client":private]=>
  bool(false)
}

和两者都不相同,所以我假设这里有什么不对劲。

验证时没有请求UrlShortener作用域,这就是失败的原因。要获得添加的作用域,可以在index.php中进行身份验证之前创建一个UrlshortenerService,传递相同的客户端实例,如下所示:

//start session
session_start();
$gClient = new Google_Client();
$gClient->setApplicationName('Test App');
$gClient->setClientId($google_client_id);
$gClient->setClientSecret($google_client_secret);
$gClient->setRedirectUri($google_redirect_url);
$gClient->setDeveloperKey($google_developer_key);
$google_oauthV2 = new Google_Oauth2Service($gClient);
$url_service = new Google_UrlshortenerService($gClient);

或者,您可以使用setScopes来覆盖自动生成的

相关内容

  • 没有找到相关文章