Login-Skript in PHP, um OAuth2 für die Netatmo-API zu nutzen und Wetterdaten abzurufen.
Die API-Dokumentation dazu ist unter https://dev.netatmo.com/apidocumentation/oauth zu finden.
Voraussetzungen
- Netatmo-API-Client-ID und Client-Secret: Registriere eine Anwendung in der Netatmo-Developer-Konsole
- PHP mit cURL-Erweiterung: Stelle sicher, dass cURL in deiner PHP-Installation aktiviert ist.
CLIENT_ID,
'redirect_uri' => REDIRECT_URI,
'scope' => 'read_station', // Passe die benötigten Berechtigungen an
'state' => bin2hex(random_bytes(16)) // Optional: Schutz vor CSRF-Angriffen
]);
$_SESSION['oauth_state'] = $authUrl['state']; // State speichern
header("Location: $authUrl");
exit;
}
// Schritt 2: Authorization Code empfangen und Access Token abrufen
if (isset($_GET['code']) && isset($_GET['state'])) {
// State validieren
if ($_GET['state'] !== $_SESSION['oauth_state']) {
die('Ungültiger State!');
}
// Authorization Code gegen Access Token tauschen
$postFields = [
'grant_type' => 'authorization_code',
'client_id' => CLIENT_ID,
'client_secret' => CLIENT_SECRET,
'redirect_uri' => REDIRECT_URI,
'code' => $_GET['code']
];
$ch = curl_init(TOKEN_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
if (isset($data['access_token'])) {
// Access Token erfolgreich erhalten
$_SESSION['access_token'] = $data['access_token'];
$_SESSION['refresh_token'] = $data['refresh_token'];
$_SESSION['expires_in'] = time() + $data['expires_in'];
echo "Login erfolgreich!";
echo "";
print_r($data); // Token-Daten anzeigen
echo "
";
} else {
die('Fehler beim Abrufen des Access Tokens: ' . $response);
}
} else {
die('Keine Authorization Code erhalten!');
}
Erklärung
Schritt 1: Weiterleitung
Der Benutzer wird zur Netatmo-Login-Seite weitergeleitet. Dort autorisiert er die Anwendung.Schritt 2: Token abrufen
Nach der Autorisierung erhält deine Anwendung einen Authorization Code, der gegen ein Access Token eingetauscht wird.Access Token speichern
Das Access Token wird in der Session gespeichert und kann für API-Aufrufe genutzt werden.
API-Aufruf mit Access Token
Nach dem Login kannst du die API mit dem Access Token aufrufen:
CLIENT_ID,
'clientSecret' => CLIENT_SECRET,
'redirectUri' => REDIRECT_URI,
'urlAuthorize' => AUTH_URL,
'urlAccessToken' => TOKEN_URL,
'urlResourceOwnerDetails' => ''
]);
session_start();
// Schritt 3: Wetterdaten mit getstationsdata abrufen
$weatherData = getWeatherData($accessToken->getToken());
echo "Wetterdaten:
";
echo "" . json_encode($weatherData, JSON_PRETTY_PRINT) . "
";
// Funktion: Wetterdaten mit Access Token abrufen
function getWeatherData($_SESSION['access_token']) {
$url = API_BASE_URL . 'getstationsdata';
// API-Aufruf mit cURL
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $accessToken"
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
Es wird noch ein Mechanismus zum Erneuern des Access Tokens benötigt. Mit dem Refresh Token kann der abgelaufene Access Token erneuert werden.
Voraussetzungen
- Access Token und Refresh Token: Diese werden nach dem ersten Login-Prozess gespeichert.
- Netatmo-Client-ID und Client-Secret: Wie bereits erwähnt.
'refresh_token',
'client_id' => CLIENT_ID,
'client_secret' => CLIENT_SECRET,
'refresh_token' => $refreshToken,
];
// cURL-Anfrage
$ch = curl_init(TOKEN_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
if (isset($data['access_token'])) {
// Erfolgreich neues Access Token erhalten
$_SESSION['access_token'] = $data['access_token'];
$_SESSION['refresh_token'] = $data['refresh_token'] ?? $refreshToken; // Eventuell neuer Refresh Token
$_SESSION['expires_in'] = time() + $data['expires_in'];
echo "Access Token erfolgreich erneuert!
";
return $data;
} else {
// Fehlerbehandlung
echo "Fehler beim Erneuern des Access Tokens: " . $response . "
";
return false;
}
}
// Überprüfung, ob ein Refresh Token verfügbar ist
if (isset($_SESSION['refresh_token'])) {
$result = refreshAccessToken($_SESSION['refresh_token']);
if ($result) {
echo "Neues Access Token: " . $_SESSION['access_token'] . "
";
}
} else {
echo "Kein Refresh Token verfügbar. Bitte erneut einloggen.";
}
Ablauf
Prüfen, ob ein Refresh Token vorhanden ist
Das Skript überprüft, ob ein gültiges Refresh Token in der Session gespeichert ist. Andernfalls wird der Benutzer gebeten, sich erneut anzumelden.Neues Access Token abrufen
Mit dem gespeicherten Refresh Token wird ein neues Access Token abgerufen und in der Session gespeichert.Daten aktualisieren
Falls Netatmo einen neuen Refresh Token zurückgibt, wird auch dieser aktualisiert.