Google Client Logins
I’m working on a little PHP app which is going to read data from a Google Spreadsheet document (more on that later).
The first thing I needed was the ability to authenticate against a Google Account which lead me to Authentication for Installed Applications. Pretty straightforward. POST a bunch of variables and, on successful login, get an Auth code back that can be used for future queries.
To that end, I threw together a little class to handle logins. I’m sure it’s been done many times before but it was a fun exercise.
class LoginFailedException extends Exception {}
class GoogleClientLogin {
public $url;
public $accountType;
public $email;
public $password;
public $service;
public $source;
public static $CALENDAR_SERVICE = 'cl';
public static $SPREADSHEET_SERVICE = 'wise';
private $responseCode;
private $auth;
public function __construct($email, $password, $service, $source, $accountType = 'GOOGLE',
$url = 'https://www.google.com/accounts/ClientLogin', $autoLogin = true) {
$this->url = $url;
$this->accountType = $accountType;
$this->email = $email;
$this->password = $password;
$this->service = $service;
$this->source = $source;
if($autoLogin) {
$this->login();
}
}
public function login() {
$postData = array(
'accountType'=>$this->accountType,
'Email'=>$this->email,
'Passwd'=>$this->password,
'service'=>$this->service,
'source'=>$this->source
);
$httprequest = curl_init($this->url);
curl_setopt($httprequest, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($httprequest, CURLOPT_POST, true);
curl_setopt($httprequest, CURLOPT_RETURNTRANSFER, true);
curl_setopt($httprequest, CURLOPT_HEADER, true);
curl_setopt($httprequest, CURLOPT_POSTFIELDS, $postData);
$rawresult = curl_exec($httprequest);
$result = explode("\n", $rawresult);
foreach($result as $line) {
$matches = array();
if( preg_match('/^HTTP.*?\s([0-9]{3})/', $line, $matches) > 0) {
$this->responseCode = $matches[1];
if($this->responseCode != '200') {
throw new LoginFailedException('The login attempt failed with a response code of ' . $this->responseCode);
}
}
$matches = array();
if( preg_match('/^Auth=(.*?)$/', $line, $matches) > 0) {
$this->auth = $matches[1];
}
}
}
public function getAuth() {
return $this->auth;
}
public function getResponseCode() {
return $this->responseCode;
}
}
And here’s how you use it
try {
$login = new GoogleClientLogin( '[username]@gmail.com', '[password]', GoogleClientLogin::$SPREADSHEET_SERVICE, '[identifier]');
echo $login->getAuth();
echo $login->getResponseCode();
}catch(LoginFailedException $e) {
echo 'Login Failed: ' . $e->getMessage();
}catch(Exception $e) {
echo 'Error occurred: ' . $e->getMessage();
}
<identifier> is just some string that identifies your app, presumably so Google can cut down on abuse.

