OAuth in den Google Data Protocol-Clientbibliotheken

Warnung: Diese Seite bezieht sich auf die älteren Google Data APIs. Sie ist nur für die APIs relevant, die im Verzeichnis der Google Data APIs aufgeführt sind. Viele davon wurden durch neuere APIs ersetzt. Informationen zu einer bestimmten neuen API finden Sie in der Dokumentation der neuen API. Informationen zum Autorisieren von Anfragen mit einer neueren API finden Sie unter Authentifizierung und Autorisierung von Google-Konten.

In diesem Dokument wird beschrieben, wie Sie die Google Data API-Clientbibliotheken verwenden, um eine Verbindung zur OAuth-Authentifizierung für Webanwendungen von Google herzustellen.

Über die OAuth-Schnittstelle kann eine webbasierte Anwendung im Namen eines Nutzers auf einen Google-Dienst zugreifen. OAuth sorgt dafür, dass die Anwendung ein Zugriffstoken erhält, ohne die Anmeldedaten des Nutzerkontos verarbeiten zu müssen.

Die Google Data API-Clientbibliotheken bieten Methoden zur Verwendung von OAuth in Ihrer Webanwendung. Insbesondere gibt es Methoden zum Erstellen eines Anfragetokens, zum Autorisieren des Anfragetokens und zum Ersetzen des autorisierten Anfragetokens durch ein Zugriffstoken. Die Bibliotheken verarbeiten auch die erforderlichen Signaturalgorithmen, wenn Sie Anfragen an einen Google Data-Dienst stellen.

Zielgruppe

Dieses Dokument richtet sich an Programmierer, die ihre webbasierten Anwendungen im Auftrag von Nutzern über die Google Data APIs-Client-Bibliotheken auf Google-Dienste zugreifen möchten.

In diesem Dokument wird davon ausgegangen, dass Sie mit der OAuth-Benutzeroberfläche und dem allgemeinen Verfahren zum Einbinden von OAuth in Ihre Webanwendung vertraut sind. Eine vollständige Beschreibung des OAuth-Protokolls finden Sie unter OAuth-Authentifizierung für Webanwendungen oder in der offiziellen Spezifikation unter oauth.net.

Dreibeiniges OAuth und Google Data APIs ohne Clientbibliotheken verwenden

Wenn Ihre Webanwendung mit OAuth als Autorisierungsmethode mit einem Google Data-Dienst interagieren soll, finden Sie alle Informationen dazu in OAuth-Authentifizierung für Webanwendungen. Wenn Sie das nicht möchten, müssen Sie die Google Data APIs-Clientbibliotheken nicht verwenden.

Im Folgenden finden Sie einen Überblick darüber, wie Ihre Anwendung einen Nutzer mit OAuth authentifizieren kann:

  1. Ihre Anwendung stellt eine signierte Anfrage zum Abrufen eines ersten OAuth-Anfragetokens vom Endpunkt OAuthRequestToken.
  2. Ihre Anwendung leitet den Nutzer zur entsprechenden OAuthAuthorizeToken-URL weiter, um das Anfragetoken zu autorisieren.
  3. Nach dem Gewähren des Zugriffs wird der Nutzer wieder zu Ihrer Anwendung weitergeleitet (URL oauth_callback).
  4. Ihre Anwendung sendet eine signierte Anfrage, um das autorisierte Anfragetoken mithilfe des OAuthGetAccessToken-Endpunkts auf ein Zugriffstoken zu aktualisieren.

Die Google Data APIs-Clientbibliotheken vereinfachen diesen Autorisierungsprozess, indem sie verschiedene Details für Sie verarbeiten. In diesem Dokument wird die Vorgehensweise beschrieben.

Webanwendung registrieren

OAuth erfordert, dass alle API-Aufrufe digital signiert sind. Google unterstützt die Signaturmethoden HMAC-SHA1 und RSA-SHA1. Damit Sie Anfragen signieren können, muss sich Ihre Anwendung bei Google registrieren. Sobald Sie sich registriert haben, erhalten Sie von Google einen Verbraucherschlüssel (und ein Geheimnis für die Verwendung mit HMAC-SHA1) sowie einen Ort zum Hochladen eines öffentlichen Zertifikats.

1. Domain registrieren

Führen Sie die Schritte unter Registrierung für webbasierte Anwendungen aus.

2. Paar aus privatem Schlüssel und öffentlichem Zertifikat erstellen (optional)

Wenn Sie RSA-SHA1 als oauth_signature_method verwenden, müssen Sie ein selbstsigniertes RSA-Paar aus privatem Schlüssel und öffentlichem Zertifikat erstellen. Beispiele finden Sie unten im Abschnitt Selbstsignierten privaten Schlüssel und öffentlichen Zertifikaten generieren.

Mit dreibeinigem OAuth und den Google Data APIs arbeiten: Beispiele für Clientbibliotheken

In den folgenden Abschnitten werden Beispiele für die Verwendung der Clientbibliotheksmethoden der Google Data APIs anhand der Schritte beschrieben, die im Abschnitt Mit OAuth arbeiten der OAuth-Dokumentation beschrieben werden. In allen Beispielen in diesem Dokument wird davon ausgegangen, dass die Hostdomain Ihrer Anwendung example.com ist.

Umfang des Datenzugriffs ermitteln

Jeder Google-Dienst definiert einen scope-Wert, der den Zugriff eines Tokens auf die Daten des Nutzers bestimmt. Die verfügbaren Werte für den Umfang finden Sie in den häufig gestellten Fragen zu Google-Daten. Wenn Sie beispielsweise die Documents List API verwenden möchten, legen Sie scope auf https://docs.google.com/feeds/ fest, wie in den FAQs aufgeführt.

Hinweis: Setzen Sie den Wert scope auf die URL mit der engsten URL, die den von Ihnen benötigten Zugriff erlaubt. So verringern Sie die Wahrscheinlichkeit, dass personenbezogene Daten versehentlich abgerufen und offengelegt werden. Wenn Sie beispielsweise auf den privaten Dokumentlistenfeed des aktuellen Nutzers zugreifen möchten, verwenden Sie den Bereich https://docs.google.com/feeds/default/private/full anstelle eines größeren Bereichs wie https://docs.google.com/feeds/, wodurch der Zugriff auf alle Dokumentlistenfeeds ermöglicht wird.

Tokens mit mehreren Bereichen

Trennen Sie zum Erstellen von Tokens für den Zugriff auf mehrere Google Data APIs die einzelnen Bereiche durch ein Leerzeichen. Im folgenden Beispiel wird ein Token mit Zugriff auf die Google Docs- und Google Kalender-Daten eines Nutzers erstellt.

scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
URL-Codierung

Nicht-ASCII-Zeichen in URLs, einschließlich Doppelpunkt, Schrägstrich und Leerzeichen, müssen URL-codiert werden, damit sie über HTTP übertragen werden können. Google Data API-Clientbibliotheken codieren automatisch Parameter für die URL-Codierung, sodass Sie einfach nicht URL-codierte Strings verwenden können, wenn Sie den Parametern Werte zuweisen. Sie können beispielsweise die folgende Zuweisung im Code vornehmen:

scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/

Wenn Sie die Clientbibliothek aufrufen, wird der Parameter scope dann automatisch auf den folgenden Wert URL-codiert:
https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f

Anfragetoken abrufen

Java

Für HMAC-SHA1 benötigen Sie eine Möglichkeit, das Token-Secret beizubehalten (in der Antwort erhalten), um ein OAuth-Token-Objekt zu erstellen, das von der Genehmigungsseite zurückgegeben wird. Legen Sie dazu eine Sitzungsvariable oder ein Cookie fest.

import com.google.gdata.client.docs.*;
import com.google.gdata.client.authn.oauth.*;

String CONSUMER_KEY = "example.com";
String CONSUMER_SECRET = "abc123doremi";

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);
oauthParameters.setScope("https://docs.google.com/feeds/");
oauthParameters.setOAuthCallback("http://www.example.com/UpgradeToken.jsp");

GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer());
oauthHelper.getUnauthorizedRequestToken(oauthParameters);

Mit RSA-SHA1 wird oauth_token_secret nicht verwendet, sodass das Token-Secret nicht beibehalten werden muss.

import com.google.gdata.client.docs.*;
import com.google.gdata.client.authn.oauth.*;

String CONSUMER_KEY = "example.com";

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
oauthParameters.setScope("https://docs.google.com/feeds/");
oauthParameters.setOAuthCallback("http://www.example.com/UpgradeToken.jsp");

PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8");

GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthRsaSha1Signer(privKey));
oauthHelper.getUnauthorizedRequestToken(oauthParameters);

...

public static PrivateKey getPrivateKey(String privKeyFileName) {
  File privKeyFile = new File(privKeyFileName);
  FileInputStream fis = new FileInputStream(privKeyFile);
  DataInputStream dis  = new DataInputStream(fis);

  byte[] privKeyBytes = new byte[(int) privKeyFile.length()];
  dis.read(privKeyBytes);
  dis.close();
  fis.close();

  String BEGIN = "-----BEGIN PRIVATE KEY-----";
  String END = "-----END PRIVATE KEY-----";
  String str = new String(privKeyBytes);
  if (str.contains(BEGIN) && str.contains(END)) {
    str = str.substring(BEGIN.length(), str.lastIndexOf(END));
  }

  KeyFactory fac = KeyFactory.getInstance("RSA");
  EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(Base64.decode(str));
  return fac.generatePrivate(privKeySpec);
}

PHP

HMAC-SHA1 als Signaturmethode verwenden:

require_once 'Zend/Oauth/Consumer.php';

session_start();

$CONSUMER_KEY = 'example.com';
$CONSUMER_SECRET = 'abc123doremi';

// Multi-scoped token.
$SCOPES = array(
  'https://docs.google.com/feeds/',
  'https://spreadsheets.google.com/feeds/'
);

$oauthOptions = array(
  'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
  'version' => '1.0',
  'consumerKey' => $CONSUMER_KEY,
  'consumerSecret' => $CONSUMER_SECRET,
  'signatureMethod' => 'HMAC-SHA1',
  'callbackUrl' => 'http://myapp.example.com/access_token.php',
  'requestTokenUrl' => 'https://www.google.com/accounts/OAuthGetRequestToken',
  'userAuthorizationUrl' => 'https://www.google.com/accounts/OAuthAuthorizeToken',
  'accessTokenUrl' => 'https://www.google.com/accounts/OAuthGetAccessToken'
);

$consumer = new Zend_Oauth_Consumer($oauthOptions);

// When using HMAC-SHA1, you need to persist the request token in some way.
// This is because you'll need the request token's token secret when upgrading
// to an access token later on. The example below saves the token object as a session variable.
if (!isset($_SESSION['ACCESS_TOKEN'])) {
  $_SESSION['REQUEST_TOKEN'] = serialize($consumer->getRequestToken(array('scope' => implode(' ', $SCOPES))));
}

RSA-SHA1 als Signaturmethode verwenden:

require_once 'Zend/Crypt/Rsa/Key/Private.php';
require_once 'Zend/Oauth/Consumer.php';

session_start();

$CONSUMER_KEY = 'example.com';
$SCOPE = 'https://docs.google.com/feeds/';

$oauthOptions = array(
  'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
  'version' => '1.0',
  'consumerKey' => $CONSUMER_KEY,
  'consumerSecret' => new Zend_Crypt_Rsa_Key_Private(file_get_contents(realpath('/path/to/yourRSAPrivateKey.pem'))),
  'signatureMethod' => 'RSA-SHA1',
  'callbackUrl' => 'http://myapp.example.com/access_token.php',
  'requestTokenUrl' => 'https://www.google.com/accounts/OAuthGetRequestToken',
  'userAuthorizationUrl' => 'https://www.google.com/accounts/OAuthAuthorizeToken',
  'accessTokenUrl' => 'https://www.google.com/accounts/OAuthGetAccessToken'
);

$consumer = new Zend_Oauth_Consumer($oauthOptions);

if (!isset($_SESSION['ACCESS_TOKEN'])) {
  $_SESSION['REQUEST_TOKEN'] = serialize($consumer->getRequestToken(array('scope' => $SCOPE)));
}

Python

HMAC-SHA1 als Signaturmethode verwenden:

Wenn Sie die neueren Klassen, Version 2.0 oder höher, basierend auf GDClient verwenden, verwenden Sie:

import gdata.gauth
import gdata.docs.client

CONSUMER_KEY = 'example.com'
CONSUMER_SECRET = 'abc123doremi'
SCOPES = ['https://docs.google.com/feeds/', 'https://www.google.com/calendar/feeds/']  # example of a multi-scoped token

client = gdata.docs.client.DocsClient(source='yourCompany-YourAppName-v1')

oauth_callback_url = 'http://%s/get_access_token' % self.request.host
request_token = client.GetOAuthToken(
    SCOPES, oauth_callback_url, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)

# When using HMAC-SHA1, you need to persist the request_token in some way.
# You'll need the token secret when upgrading to an access token later on.
# In Google App Engine, you can use the AeSave helper:
# gdata.gauth.AeSave(request_token, 'myKey')

RSA-SHA1 als Signaturmethode verwenden:

...

f = open('/path/to/yourRSAPrivateKey.pem')
RSA_KEY = f.read()
f.close()

request_token = client.GetOAuthToken(SCOPES, oauth_callback_url, CONSUMER_KEY, rsa_private_key=RSA_KEY)

Wenn Sie die älteren v1.0-Klassen verwenden, die auf GDataService basieren, unterscheiden sich die Aufrufe etwas:

import gdata.auth
import gdata.docs.service

CONSUMER_KEY = 'example.com'
CONSUMER_SECRET = 'abc123doremi'

client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1')
client.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)

req_token = client.FetchOAuthRequestToken()
client.SetOAuthToken(req_token)

RSA-SHA1 als Signaturmethode verwenden:

...

f = open('/path/to/yourRSAPrivateKey.pem')
RSA_KEY = f.read()
f.close()

client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1')
client.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.RSA_SHA1, CONSUMER_KEY, rsa_key=RSA_KEY)

SCOPES = ['https://docs.google.com/feeds/', 'https://www.google.com/calendar/feeds/']  # example of a multi-scoped token
req_token = client.FetchOAuthRequestToken(scopes=SCOPES)
client.SetOAuthToken(req_token)

.NET

HMAC-SHA1 als Signaturmethode verwenden:

using Google.GData.Client;

string CONSUMER_KEY = "example.com";
string CONSUMER_SECRET = "abc123doremi";

// Multi-scoped token.
string SCOPE = "https://www.google.com/calendar/feeds/ https://www.google.com/m8/feeds/";

OAuthParameters parameters = new OAuthParameters() {
  ConsumerKey = CONSUMER_KEY,
  ConsumerSecret = CONSUMER_SECRET,
  Scope = SCOPE,
  Callback = "http://myapp.example.com/access_token",
  SignatureMethod = "HMAC-SHA1"
}

OAuthUtil.GetUnauthorizedRequestToken(parameters);

RSA-SHA1 als Signaturmethode verwenden:

RSA-SHA1 is not supported yet.

Anfragetoken autorisieren

Zum Autorisieren eines Anfrage-Tokens muss der Nutzer von der Anwendung zur URL OAuthAuthorizeToken weitergeleitet werden. Dadurch wird er aufgefordert, sich in seinem Google-Konto anzumelden. Weitere Informationen zur OAuthAuthorizeToken-URL finden Sie in der vollständigen OAuth-Authentifizierung für Webanwendungen.

Zum Erstellen der OAuthAuthorizeToken-URL in Ihrer Anwendung verwenden Sie für jede Clientbibliothek Folgendes: Diese Beispiele basieren auf den vorherigen Beispielen.

Nachdem Sie die URL der Genehmigungsseite erstellt haben, kann sie von Ihrer Anwendung auf verschiedene Arten verwendet werden, um den Nutzer an den OAuthAuthorizeToken-Handler zu senden. Der häufigste Ansatz besteht darin, den Nutzer weiterzuleiten oder einen Link zu dieser Seite anzuzeigen.

Java

Für HMAC-SHA1:

String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters);
System.out.println(approvalPageUrl);

Für RSA-SHA1:

String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters);
System.out.println(approvalPageUrl);

PHP

// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com').
$approvalUrl = $consumer->getRedirectUrl(array('hd' => 'default'));
echo "<a href=\"$approvalUrl\">Grant access</a>";

Alternativ können Sie einfach zur Genehmigungs-URL weiterleiten:

// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com').
$consumer->redirect(array('hd' => 'default'));

Python

Wenn Sie die neueren Klassen, Version 2.0 oder höher, basierend auf GDClient verwenden, verwenden Sie:

# req_token is from previous call to client.GetOAuthToken()
domain = None  # If on a G Suite domain, use your domain (e.g. 'example.com').
self.redirect(request_token.generate_authorization_url(google_apps_domain=domain))

Wenn Sie die älteren v1.0-Klassen basierend auf GDataService verwenden, ist der Vorgang ein wenig anders.

# req_token is from previous call to client.FetchOAuthRequestToken()
oauth_callback_url = 'http://%s/get_access_token' % self.request.host
self.redirect(client.GenerateOAuthAuthorizationURL(callback_url=oauth_callback_url))

.NET

string authorizationUrl = OAuthUtil.CreateUserAuthorizationUrl(parameters);
Console.WriteLine(authorizationUrl);

Token aus der Callback-URL extrahieren

Wenn Google zu Ihrer Anwendung zurückgeleitet wird, wird oauth_token als Suchparameter an die URL „oauth_callback_url“ angehängt. Die Anwendung sollte dann den Tokenwert aus dem URL-Suchparameter extrahieren und die oauth-Parameter neu einrichten.

Die Clientbibliotheken bieten praktische Methoden zum Extrahieren von oauth_token. Diese Beispiele basieren auf den vorherigen Beispielen.

Java

Wenn Sie das Token-Secret in der Callback-URL beibehalten (bei Verwendung von HMAC-SHA1):

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);

GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer());
oauthHelper.getOAuthParametersFromCallback(request.getQueryString(), oauthParameters);

Der einzige Unterschied zu RSA-SHA1 ist die Signaturmethode:

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);

PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8");

GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthRsaSha1Signer(privKey));
oauthHelper.getOAuthParametersFromCallback(request.getQueryString(), oauthParameters);

PHP

Dieser Schritt ist bei Verwendung der PHP-Bibliothek nicht erforderlich.

Python

Wenn Sie die neueren Klassen, Version 2.0 oder höher, basierend auf GDClient verwenden, verwenden Sie:

# Recall request_token. In Google App Engine, use AeLoad():
# saved_request_token = gdata.gauth.AeLoad('myKey')

request_token = gdata.gauth.AuthorizeRequestToken(saved_request_token, self.request.uri)

Wenn Sie die älteren v1.0-Klassen basierend auf GDataService verwenden, verwenden Sie:

oauth_token = gdata.auth.OAuthTokenFromUrl(self.request.uri)
if oauth_token:
  oauth_token.secret = # TODO: recall saved request_token and set the token secret here.
  oauth_token.oauth_input_params = gdata.auth.OAuthInputParams(
      gdata.auth.OAuthSignatureMethod.HMAC_SHA1, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)
 client.SetOAuthToken(oauth_token)
else:
  print 'No oauth_token found in the URL'

Der Vorgang für RSA-SHA1 ist ähnlich, aber ohne das Token-Secret:

oauth_token = gdata.auth.OAuthTokenFromUrl(self.request.uri)
if oauth_token:
  oauth_token.oauth_input_params = gdata.auth.OAuthInputParams(
      gdata.auth.OAuthSignatureMethod.RSA_SHA1, CONSUMER_KEY, rsa_key=RSA_KEY)
 client.SetOAuthToken(oauth_token)
else:
  print 'No oauth_token found in the URL'

.NET

Wenn Sie das Token-Secret in der Callback-URL beibehalten möchten:

OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);

Upgrade auf Zugriffstoken ausführen

Im letzten Schritt des OAuth-Token-Tanzes muss das autorisierte Anfrage-Token mithilfe der URL OAuthGetAccessToken auf ein langlebiges Zugriffstoken aktualisiert werden. Dies wird in der vollständigen Dokumentation zur OAuth-Authentifizierung für Webanwendungen beschrieben.

Im Folgenden finden Sie einige Beispiele für die einzelnen Clientbibliotheken:

Java

String accessToken = oauthHelper.getAccessToken(oauthParameters);
// You can also pull the OAuth token string from the oauthParameters:
// String accessToken = oauthParameters.getOAuthToken();
System.out.println("OAuth Access Token: " + accessToken);

String accessTokenSecret = oauthParameters.getOAuthTokenSecret();
System.out.println("OAuth Access Token's Secret: " + accessTokenSecret);

PHP

if (!isset($_SESSION['ACCESS_TOKEN'])) {
  if (!empty($_GET) && isset($_SESSION['REQUEST_TOKEN'])) {
    $_SESSION['ACCESS_TOKEN'] = serialize($consumer->getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN'])));
  }
}

Python

Wenn Sie die neueren Klassen, Version 2.0 oder höher, basierend auf GDClient verwenden, verwenden Sie:

# Upgrade the token and save in the user's datastore
access_token = client.GetAccessToken(request_token)

# If you're using Google App Engine, you can call the AeSave() method to save
# the access token under the current logged in user's account.
#gdata.gauth.AeSave(access_token, token_key)

Wenn Sie die älteren v1.0-Klassen basierend auf GDataService verwenden, verwenden Sie:

access_token = client.UpgradeToOAuthAccessToken()  # calls SetOAuthToken() for you

Wenn Sie gdata.gauth.AeSave() in App Engine verwenden, werden das Token und das Token-Secret für den aktuell angemeldeten Nutzer gespeichert.

.NET

OAuthUtil.GetAccessToken(parameters);

// If you want to extract the OAuth Token/TokenSecret from the OAuthParameters instance:
string accessToken = parameter.Token;
Console.WriteLine("OAuth Access Token: " + accessToken);

string accessTokenSecret = parameter.TokenSecret;
Console.WriteLine("OAuth Access Token's Secret: " + accessTokenSecret);

Hinweis: Wenn Sie HMAC-SHA1 verwenden, müssen Sie das Token-Geheimnis des Zugriffstokens zusammen mit dem Tokenwert in Ihrer Datenbank speichern. Andernfalls können Sie die oauth-Parameter für die spätere Verwendung nicht ordnungsgemäß rekonstruieren.

Zugriffstoken

Nachdem Sie ein Zugriffstoken erhalten haben, verwenden Sie die Standardaufrufe der Google Data APIs-Clientbibliothek, um mit dem Dienst zu interagieren. Die Bibliothek übernimmt das Signieren der Anfragen und das Einfügen des korrekten Autorisierungsheaders. Normalerweise rufen Sie das Token des Nutzers von einem Cookie oder einer Datenbank ab. Diese Beispiele zeigen, wie die oauth-Parameter rekonstruiert und ein Clientbibliotheksaufruf durchgeführt wird.

Java

Wenn Sie HMAC-SHA1 verwenden:

  GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
  oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
  oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);
  oauthParameters.setOAuthToken(ACCESS_TOKEN);
  oauthParameters.setOAuthTokenSecret(TOKEN_SECRET);

  DocsService client = new DocsService("yourCompany-YourAppName-v1");
  client.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());

  URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full");
  DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class);
  for (DocumentListEntry entry : resultFeed.getEntries()) {
    System.out.println(entry.getTitle().getPlainText());
  }
  

Der Unterschied zu RSA-SHA1 besteht darin, dass Sie das Secret für das Zugriffstoken nicht festlegen müssen und das Signaturobjekt anders erstellt wird.

  GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
  oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
  oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);
  oauthParameters.setOAuthToken(ACCESS_TOKEN);

  PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8");  // See above for the defintion of getPrivateKey()

  DocsService client = new DocsService("yourCompany-YourAppName-v1");
  client.setOAuthCredentials(oauthParameters, new OAuthRsaSha1Signer(privKey));

  URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full");
  DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class);
  for (DocumentListEntry entry : resultFeed.getEntries()) {
    System.out.println(entry.getTitle().getPlainText());
  }
  

PHP

require_once 'Zend/Gdata/Docs.php';

if (isset($_SESSION['ACCESS_TOKEN'])) {
  $accessToken = unserialize($_SESSION['ACCESS_TOKEN']);
} else {
  exit;
}


/*  Or, you could set an existing token (say one stored from your database). For HMAC-SHA1:
$accessToken = new Zend_Oauth_Token_Access();
$accessToken->setToken('1/AQfoI-qJDqkvvkf216Gc2g');
$accessToken->setTokenSecret('2c26GLW250tZiQ');
*/

$httpClient = $accessToken->getHttpClient($oauthOptions);
$client = new Zend_Gdata_Docs($httpClient, "yourCompany-YourAppName-v1");

// Retrieve user's list of Google Docs
$feed = $client->getDocumentListFeed();
foreach ($feed->entries as $entry) {
  echo "$entry->title\n";
}

Python

Bei diesem Snippet wird davon ausgegangen, dass Sie bereits ein Zugriffstoken mit HMAC-SHA1 abgerufen haben und diesen Tokenschlüssel zur späteren Verwendung abrufen.

Wenn Sie die neueren Klassen, Version 2.0 oder höher, basierend auf GDClient verwenden, verwenden Sie:

client = gdata.docs.client.DocsClient(source='yourCo-yourAppName-v1')
client.auth_token = gdata.gauth.OAuthHmacToken(CONSUMER_KEY, CONSUMER_SECRET, TOKEN,
                                               TOKEN_SECRET, gdata.gauth.ACCESS_TOKEN)
feed = client.GetDocList()
for entry in feed.entry:
  print entry.title.text

Wenn Sie die älteren v1.0-Klassen basierend auf GDataService verwenden, verwenden Sie:

client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1')
client.SetOAuthInputParameters(SIG_METHOD, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)

# the token key and secret should be recalled from your database
client.SetOAuthToken(gdata.auth.OAuthToken(key=TOKEN, secret=TOKEN_SECRET))

feed = client.GetDocumentListFeed()
for entry in feed.entry:
  print entry.title.text

.NET

Wenn Sie HMAC-SHA1 verwenden:

OAuthParameters parameters = new OAuthParameters() {
  ConsumerKey = CONSUMER_KEY,
  ConsumerSecret = CONSUMER_SECRET,
  Token = ACCESS_TOKEN,
  TokenSecret = TOKEN_SECRET
}

GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("writely", APPLICATION_NAME, parameters);

DocsService service = new DocsService(APPLICATION_NAME);
service.RequestFactory = requestFactory;

DocumentsListQuery query = new DocumentsListQuery();
DocumentsFeed feed = service.Query(query);
foreach (DocumentEntry entry in feed.Entries) {
  Console.WriteLine(entry.Title.Text);
}

Der Unterschied zu RSA-SHA1 besteht darin, dass Sie das Secret für das Zugriffstoken nicht festlegen müssen und das Signaturobjekt anders erstellt wird.

RSA-SHA1 is not supported yet.

Zusätzliche dreibeinige OAuth-Ressourcen und Beispiele

Nach oben

2-legged OAuth

Zweibeiniges OAuth ermöglicht vertrauenswürdigen Anwendungen den direkten Zugriff auf Google-Daten von Nutzern. Zwei Schlüsselgruppen können das zweibeinige OAuth verwenden:

G Suite-Domainadministratoren:Administratoren können Skripts und benutzerdefinierte Anwendungen erstellen, mit denen die Nutzerdaten für ihre Domain über Google Data APIs verwaltet werden. Informationen zum Verwalten des mit Ihrer G Suite-Domain verknüpften Schlüssels und Secrets und zum Gewähren einer globalen Zugriffssteuerung finden Sie unter OAuth-Key und -Secret verwalten.

Drittanbieter-Software: Anbieter können Anwendungen mit zweibeinigem OAuth für die Einbindung in die G Suite anbieten. Der Zugriff für Anwendungen von Drittanbietern kann auf der Seite „API-Client verwalten“ oder über den G Suite Marketplace gewährt werden.

Gemäß dem normalen Autorisierungsablauf (auch als dreibeiniges OAuth bezeichnet) ist kein Zugriffstoken erforderlich.

Die folgenden Beispiele zeigen, wie Sie Ihren Client so einrichten, dass 2 Legged OAuth mit HMAC-SHA1 verwendet wird.

Java

import com.google.gdata.client.docs.*;
import com.google.gdata.client.authn.oauth.*;

String CONSUMER_KEY = "example.com";
String CONSUMER_SECRET = "abc123doremi";

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);

DocsService client = new DocsService("yourCompany-YourAppName-v1");
client.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());

// Retrieve user's list of Google Docs
String user = "any.user@anydomain.com";
URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full" +
                      "?xoauth_requestor_id=" + user);

DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class);
for (DocumentListEntry entry : resultFeed.getEntries()) {
  System.out.println(entry.getTitle().getPlainText());
}

PHP

require_once 'Zend/Oauth/Consumer.php';
require_once 'Zend/Gdata/Docs.php';

$CONSUMER_KEY = 'example.com';
$CONSUMER_SECRET = 'abc123doremi';
$USER = 'any.user@anydomain.com';

$oauthOptions = array(
    'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
    'version' => '1.0',
    'signatureMethod' => 'HMAC-SHA1',
    'consumerKey' => $CONSUMER_KEY,
    'consumerSecret' => $CONSUMER_SECRET
);

$consumer = new Zend_Oauth_Consumer($oauthOptions);
$token = new Zend_Oauth_Token_Access();
$httpClient = $token->getHttpClient($oauthOptions);

$client = new Zend_Gdata_Docs($httpClient);

// Retrieve user's list of Google Docs
$feed = $client->getDocumentListFeed('https://docs.google.com/feeds/default/private/full?xoauth_requestor_id=' . urlencode($USER));
foreach ($feed->entries as $entry) {
  echo "$entry->title\n";
}

Python

Wenn Sie die neueren Klassen, Version 2.0 oder höher, basierend auf GDClient verwenden, verwenden Sie:

import gdata.gauth
import gdata.docs.client

CONSUMER_KEY = 'example.com'
CONSUMER_SECRET = 'abc123doremi'
requestor_id = 'any.user@anydomain.com'

client = gdata.docs.client.DocsClient(source='yourCompany-YourAppName-v1')
client.auth_token = gdata.gauth.TwoLeggedOAuthHmacToken(
    CONSUMER_KEY, CONSUMER_SECRET, requestor_id)

# Retrieve user's list of Google Docs
feed = client.GetDocList()
for entry in feed.entry:
  print entry.title.text

Wenn Sie die älteren v1.0-Klassen basierend auf GDataService verwenden, verwenden Sie:

import gdata.auth
import gdata.docs.service

CONSUMER_KEY = 'example.com'
CONSUMER_SECRET = 'abc123doremi'
SIG_METHOD = gdata.auth.OAuthSignatureMethod.HMAC_SHA1

requestor_id = 'any.user@anydomain.com'

client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1')
client.SetOAuthInputParameters(SIG_METHOD, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET,
                               two_legged_oauth=True, requestor_id=requestor_id)

# Retrieve user's list of Google Docs
feed = client.GetDocumentListFeed()
for entry in feed.entry:
  print entry.title.text

# Change to another user on your domain
client.GetOAuthInputParameters().requestor_id = 'another.user@example.com'

.NET

using Google.GData.Client;
using Google.GData.Documents;

// Create an OAuth factory to use
GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("writely", "yourCompany-YourAppName-v1");
requestFactory.ConsumerKey = "example.com";
requestFactory.ConsumerSecret = "abc123doremi";

String user = "any.user@anydomain.com";

DocumentsService client = new DocumentsService("yourCompany-YourAppName-v1");
client.RequestFactory = requestFactory;

// Retrieve user's list of Google Docs
DocumentsListQuery query = new DocumentsListQuery();
query.Uri = new OAuthUri("https://docs.google.com/feeds/default/private/full", user, requestFactory.ConsumerKey);

DocumentsFeed feed = client.Query(query);

foreach (DocumentEntry entry in feed.Entries)
{
  Console.WriteLine(entry.Title.Text);
}

Zusätzliche zweibeinige OAuth-Ressourcen und Beispiele

Einen selbst signierenden privaten Schlüssel und ein öffentliches Zertifikat generieren

Der private Schlüssel wird verwendet, um eine Signatur zu generieren, die in jeder Anfrage enthalten sein muss. Der im Zertifikat eingebettete öffentliche Schlüssel wird von Google verwendet, um die Signatur zu überprüfen. Der öffentliche Schlüssel muss ein 1024-Bit-RSA-Schlüssel sein, der in einem X.509-Zertifikat im PEM-Format codiert ist. Das Zertifikat sollte bei der Registrierung an Google gesendet werden.

In den folgenden Abschnitten finden Sie Beispiele zum Generieren von Schlüsseln und Zertifikaten mit zwei bestimmten Tools: dem OpenSSL-Dienstprogramm und dem Java-Dienstprogramm keytool.

Diese Beispiele gelten nicht nur für die Google Data APIs. Sie können mit denselben Dienstprogrammen Schlüssel für beliebige Zwecke generieren.

In den Beispielen wird davon ausgegangen, dass Ihr Unternehmen den Namen „My_Company“ hat und sich in Mountain View, Kalifornien, USA, mit dem Domainnamen „beispiel.de“ befindet.

Schlüssel mit OpenSSL generieren

Mit dem folgenden Befehl können Sie ein Paar RSA-Schlüssel und das entsprechende Zertifikat erstellen:

# Generate the RSA keys and certificate
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -sha1 -subj \
  '/C=US/ST=CA/L=Mountain View/CN=www.example.com' -keyout \
  myrsakey.pem -out /tmp/myrsacert.pem

Warnung: Wenn Sie den Parameter -nodes angeben, wird zum Schutz ein privater Schlüssel ohne Passwort erstellt. Sie sollten diesen Parameter jedoch aus Sicherheitsgründen weglassen.

Der Parameter -sha1 gibt an, dass der Schlüssel zum Generieren von SHA1-Signaturen verwendet wird.

Der Parameter -subj gibt die Identität der Anwendung an, die das Zertifikat darstellt.

Der Parameter -keyout gibt die Datei an, die die Schlüssel enthält. Diese Datei enthält vertrauliche Informationen und sollte geschützt und an niemanden weitergegeben werden.

Der Parameter -out gibt die Datei an, die das Zertifikat im PEM-Format enthält (das bei der Registrierung an Google gesendet werden kann).

Schlüssel für den .NET-Client generieren

Das .NET Framework kann keine Schlüssel oder Zertifikate verstehen, die im PEM-Format gespeichert sind. Daher ist ein zusätzlicher Schritt erforderlich, nachdem Sie die PEM-Datei erstellt haben:

openssl pkcs12 -export -in test_cert.pem -inkey myrsacert.pem -out myrsacert.pfx -name "Testing Certificate"

Mit diesem Schritt wird eine PFX-Datei aus Ihrem privaten Schlüssel und Zertifikat erstellt. Diese Datei kann in die .NET-Clientbibliothek importiert werden, um Anfragen an die Google Data APIs digital zu signieren.

Schlüssel für den Java-Client generieren

Der Java-Client akzeptiert private Schlüssel im PKCS#8-Format. Nachdem Sie einen Schlüssel oder ein Zertifikat mithilfe der obigen Anleitung generiert haben, erstellen Sie aus Ihrer generierten PEM-Datei eine PK8-Datei:

openssl pkcs8 -in myrsakey.pem -topk8 -nocrypt -out myrsakey.pk8

Alternativ können Sie den Java-Schlüsselspeicher und das Keytool-Dienstprogramm verwenden, um ein RSA-Schlüsselpaar und das entsprechende Zertifikat zu erstellen. Verwenden Sie den folgenden Befehl:

# Generate the RSA keys and certificate
keytool -genkey -v -alias Example -keystore ./Example.jks\
  -keyalg RSA -sigalg SHA1withRSA\
  -dname "CN=www.example.com, OU=Engineering, O=My_Company, L=Mountain  View, ST=CA, C=US"\
  -storepass changeme -keypass changeme

Warnung: „changeme“ ist kein gutes Passwort, sondern nur ein Beispiel.

Der Parameter -dname gibt die Identität der Anwendung an, die das Zertifikat darstellt. Der Parameter -storepass gibt das Passwort zum Schutz des Schlüsselspeichers an. Der Parameter -keypass gibt das Passwort zum Schutz des privaten Schlüssels an.

Verwenden Sie den folgenden Befehl, um das Zertifikat in eine Datei zu schreiben, die im Tool ManageDomains verwendet werden kann:

# Output the public certificate to a file
keytool -export -rfc -keystore ./Example.jks -storepass changeme \
  -alias Example -file mycert.pem

Nach oben