Signatur
Beschreibung
Die Klasse OAuth ist Teil der PECL-Erweiterung oauth und implementiert das OAuth-1.0-Protokoll (RFC 5849). Sie ermöglicht es, signierte HTTP-Anfragen an APIs zu stellen, die eine Drei-Wege-Authentifizierung (Consumer, Service-Provider, Resource-Owner) erfordern – typischerweise ältere Social-Media-APIs oder Unternehmensservices.
Der typische Ablauf umfasst: Anfordern eines Request-Tokens vom Provider, Weiterleiten des Nutzers zur Autorisierungsseite, Empfang des Verification-Codes, Umtausch gegen ein Access-Token und anschließendes Ausführen geschützter API-Aufrufe. Die Klasse übernimmt die HMAC-SHA1- (oder RSA-SHA1- bzw. PLAINTEXT-) Signierung aller Anfragen automatisch.
Die Klasse stellt Methoden wie getRequestToken(), getAccessToken() und fetch() bereit, die die meisten boilerplate-Schritte kapseln. Über setToken() und setAuthType() lässt sich das Verhalten weiter anpassen.
Hinweis: Die PECL-oauth-Erweiterung muss separat installiert sein (pecl install oauth). Für OAuth 2.0 sind andere Bibliotheken notwendig (z. B. league/oauth2-client).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $consumer_key Pflicht | string | Der Consumer-Key (auch Application-Key genannt), der vom OAuth-Provider bei der App-Registrierung ausgestellt wird. | |
| $consumer_secret Pflicht | string | Das Consumer-Secret, das zusammen mit dem Consumer-Key vom Provider ausgestellt wird und zur Signierung der Anfragen verwendet wird. | |
| $signature_method | string | OAUTH_SIG_METHOD_HMACSHA1 | Die zu verwendende Signaturmethode. Mögliche Werte sind OAUTH_SIG_METHOD_HMACSHA1, OAUTH_SIG_METHOD_RSASHA1 oder OAUTH_SIG_METHOD_PLAINTEXT. |
| $auth_type | int | OAUTH_AUTH_TYPE_AUTHORIZATION | Legt fest, wie die OAuth-Parameter übertragen werden. Mögliche Werte: OAUTH_AUTH_TYPE_AUTHORIZATION (HTTP-Header), OAUTH_AUTH_TYPE_FORM (POST-Body), OAUTH_AUTH_TYPE_URI (Query-String), OAUTH_AUTH_TYPE_NONE. |
Beispiele
Request-Token anfordern und Nutzer zur Autorisierung weiterleiten
<?php
// Voraussetzung: PECL-Erweiterung 'oauth' ist installiert
$consumerKey = 'mein_consumer_key';
$consumerSecret = 'mein_consumer_secret';
try {
$oauth = new OAuth($consumerKey, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_AUTHORIZATION);
$oauth->enableDebug(); // Gibt Debuginformationen aus (nur Entwicklung!)
$requestTokenUrl = 'https://api.example.com/oauth/request_token';
$authorizeUrl = 'https://api.example.com/oauth/authorize';
$callbackUrl = 'https://meine-app.example.com/callback';
$requestTokenInfo = $oauth->getRequestToken($requestTokenUrl, $callbackUrl);
// Token in der Session speichern
session_start();
$_SESSION['request_token'] = $requestTokenInfo['oauth_token'];
$_SESSION['request_token_secret'] = $requestTokenInfo['oauth_token_secret'];
// Nutzer zur Autorisierungsseite weiterleiten
$redirectUrl = $authorizeUrl . '?oauth_token=' . urlencode($requestTokenInfo['oauth_token']);
header('Location: ' . $redirectUrl);
exit;
} catch (OAuthException $e) {
echo 'OAuth-Fehler: ' . htmlspecialchars($e->getMessage());
}
Access-Token einlösen und geschützte API-Ressource abrufen
<?php
// Callback-Seite: Verarbeitung nach Rückkehr vom Provider
session_start();
$consumerKey = 'mein_consumer_key';
$consumerSecret = 'mein_consumer_secret';
try {
$oauth = new OAuth($consumerKey, $consumerSecret);
// Gespeichertes Request-Token setzen
$oauth->setToken($_SESSION['request_token'], $_SESSION['request_token_secret']);
// Request-Token gegen Access-Token eintauschen
$accessTokenUrl = 'https://api.example.com/oauth/access_token';
$verifier = $_GET['oauth_verifier'] ?? '';
$accessTokenInfo = $oauth->getAccessToken($accessTokenUrl, null, $verifier);
// Access-Token persistieren (z. B. in Datenbank speichern)
$accessToken = $accessTokenInfo['oauth_token'];
$accessTokenSecret = $accessTokenInfo['oauth_token_secret'];
// Jetzt geschützte Ressource abrufen
$oauth->setToken($accessToken, $accessTokenSecret);
$oauth->fetch('https://api.example.com/v1/user/profile');
$response = json_decode($oauth->getLastResponse(), true);
echo 'Benutzername: ' . htmlspecialchars($response['username'] ?? '(unbekannt)');
} catch (OAuthException $e) {
echo 'OAuth-Fehler: ' . htmlspecialchars($e->getMessage());
// Detaillierte Fehlermeldung:
// var_dump($oauth->getLastResponseInfo());
}
// Wichtig · Fallstricke
Sicherheitshinweise:
- Consumer-Key und Consumer-Secret niemals im Client-seitigen Code oder in öffentlichen Repositories ablegen. Umgebungsvariablen oder verschlüsselte Konfigurationsdateien verwenden.
enableDebug()gibt sensible Tokendaten aus – ausschließlich in der Entwicklungsumgebung verwenden.- Alle OAuth-Kommunikation sollte ausnahmslos über HTTPS erfolgen, da PLAINTEXT-Signaturen bei unverschlüsselter Verbindung trivial angreifbar sind.
- Request-Tokens und temporäre Secrets sollten nur sehr kurzlebig in der Session gehalten und danach verworfen werden.
Weitere Hinweise:
- Die Klasse ist nicht für OAuth 2.0 geeignet. OAuth 2.0 basiert auf einem grundlegend anderen Konzept (Bearer-Token, kein Signing).
- Die PECL-Erweiterung ist seit Jahren kaum weiterentwickelt worden; für neue Projekte empfiehlt sich eine aktiv gepflegte Composer-Bibliothek.
- Bei Fehlern wirft die Klasse eine
OAuthException; die MethodegetLastResponseInfo()liefert HTTP-Metadaten zur Fehleranalyse.