| 
<?php/*
 * Copyright 2012 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
 /**
 * Credentials object used for OAuth 2.0 Signed JWT assertion grants.
 *
 * @author Chirag Shah <[email protected]>
 */
 class Google_AssertionCredentials {
 const MAX_TOKEN_LIFETIME_SECS = 3600;
 
 public $serviceAccountName;
 public $scopes;
 public $privateKey;
 public $privateKeyPassword;
 public $assertionType;
 public $sub;
 /**
 * @deprecated
 * @link http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06
 */
 public $prn;
 
 /**
 * @param $serviceAccountName
 * @param $scopes array List of scopes
 * @param $privateKey
 * @param string $privateKeyPassword
 * @param string $assertionType
 * @param bool|string $sub The email address of the user for which the
 *               application is requesting delegated access.
 */
 public function __construct(
 $serviceAccountName,
 $scopes,
 $privateKey,
 $privateKeyPassword = 'notasecret',
 $assertionType = 'http://oauth.net/grant_type/jwt/1.0/bearer',
 $sub = false) {
 $this->serviceAccountName = $serviceAccountName;
 $this->scopes = is_string($scopes) ? $scopes : implode(' ', $scopes);
 $this->privateKey = $privateKey;
 $this->privateKeyPassword = $privateKeyPassword;
 $this->assertionType = $assertionType;
 $this->sub = $sub;
 $this->prn = $sub;
 }
 
 public function generateAssertion() {
 $now = time();
 
 $jwtParams = array(
 'aud' => Google_OAuth2::OAUTH2_TOKEN_URI,
 'scope' => $this->scopes,
 'iat' => $now,
 'exp' => $now + self::MAX_TOKEN_LIFETIME_SECS,
 'iss' => $this->serviceAccountName,
 );
 
 if ($this->sub !== false) {
 $jwtParams['sub'] = $this->sub;
 } else if ($this->prn !== false) {
 $jwtParams['prn'] = $this->prn;
 }
 
 return $this->makeSignedJwt($jwtParams);
 }
 
 /**
 * Creates a signed JWT.
 * @param array $payload
 * @return string The signed JWT.
 */
 private function makeSignedJwt($payload) {
 $header = array('typ' => 'JWT', 'alg' => 'RS256');
 
 $segments = array(
 Google_Utils::urlSafeB64Encode(json_encode($header)),
 Google_Utils::urlSafeB64Encode(json_encode($payload))
 );
 
 $signingInput = implode('.', $segments);
 $signer = new Google_P12Signer($this->privateKey, $this->privateKeyPassword);
 $signature = $signer->sign($signingInput);
 $segments[] = Google_Utils::urlSafeB64Encode($signature);
 
 return implode(".", $segments);
 }
 }
 
 |