Ziel
Ein Nutzer loggt sich in WordPress mit 2FA ein.
Und darf danach ĂŒber das Portal auf Access-Daten zugreifen – aber nur, solange die Session gĂŒltig ist.
Also keine zweite Passwortabfrage in Access.
Aber eben auch keine offene TĂŒr fĂŒr anonyme Zugriffe.
Ich zeig Dir, wie Du das koppeln kannst – sicher, nachvollziehbar und fĂŒr KMU handhabbar.
Grundidee
- WordPress ĂŒbernimmt die Authentifizierung (inkl. 2FA per Plugin oder Authenticator App)
- Access fragt bei jeder API-Anfrage ein Token oder einen Session-Wert ab
- Das Token ist kurzlebig, eindeutig und serverseitig verifizierbar
- Ohne gĂŒltiges Token: kein Zugriff
Komponenten
| Teil | Technik |
|---|---|
| Login mit 2FA | WordPress + Plugin (z. B. WP 2FA) |
| Token-Erzeugung | PHP (JWT oder Random-Key + DB) |
| Token-Validierung | Access â Middleware â WordPress |
| Zugriff freigeben | nur bei gĂŒltigem Token |
Schritt 1: WordPress 2FA einrichten
Installier z. B. das Plugin WP 2FA oder miniOrange Google Authenticator.
Der Login wird damit geschĂŒtzt.
Du brauchst nichts weiter tun – auĂer sicherzustellen, dass nur eingeloggte Benutzer einen API-Token anfordern dĂŒrfen.
Schritt 2: Token nach Login erzeugen
Erstelle eine API-Route, z. B. /wp-json/access/v1/token
add_action('rest_api_init', function () {
register_rest_route('access/v1', '/token', [
'methods' => 'GET',
'callback' => 'erzeuge_token',
'permission_callback' => function () {
return is_user_logged_in();
}
]);
});
function erzeuge_token() {
$user_id = get_current_user_id();
$token = bin2hex(random_bytes(16));
$expires = time() + 300; // 5 Minuten
set_transient('access_token_' . $token, $user_id, 300);
return ['token' => $token, 'valid_until' => $expires];
}
Schritt 3: Access fragt Token bei jeder Aktion ab
In Access:
Public Function HoleWPToken(user As String, pw As String) As String
' Login sollte bereits erfolgt sein - Token wird vom Web geholt
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "GET", "https://deine-domain.de/wp-json/access/v1/token", False
http.setRequestHeader "Cookie", "wordpress_logged_in_HASH=..." ' aus vorherigem Login
http.Send
If http.Status = 200 Then
HoleWPToken = ParseToken(http.responseText)
Else
HoleWPToken = ""
End If
End Function
Oder Du forderst den Token manuell ĂŒber einen geschĂŒtzten Shortcode in WordPress an (z. B. nach Login im Portal) und speicherst ihn in Access als Variable.
Schritt 4: Token validieren vor Zugriff auf Access-API
Access fragt nicht direkt WordPress, sondern geht ĂŒber eine Middleware (Node.js, PHP, n8n, âŠ).
Middleware prĂŒft:
$token = $_GET['token'];
$user_id = get_transient('access_token_' . $token);
if (!$user_id) {
http_response_code(403);
echo json_encode(['error' => 'invalid or expired token']);
exit;
}
Dann erst wird mit Access gesprochen – z. B. via ODBC, COM oder REST.
Access-Logik: Zugriff nur bei gĂŒltigem Token
In Access kannst Du Tokens als Argument an Reports oder Forms ĂŒbergeben.
If Not TokenGĂŒltig(Me.txtToken) Then
MsgBox "Zugriff verweigert - ungĂŒltiger Token", vbCritical
Cancel = True
End If
Oder Du gibst nur dann Daten zurĂŒck, wenn der Token vorab erfolgreich validiert wurde.
Token-Protokollierung in WordPress
Optional kannst Du das Token auch in einer Datenbanktabelle speichern:
CREATE TABLE wp_access_tokens (
id INT AUTO_INCREMENT PRIMARY KEY,
token VARCHAR(64),
user_id BIGINT,
expires DATETIME,
used BOOLEAN DEFAULT 0
);
Dann kannst Du z. B. auch Limits setzen:
- Nur 1 Token pro Minute pro Benutzer
- Nur Zugriff auf eigene Daten (ĂŒber user_id)
Ablauf in der Praxis
- User loggt sich in WordPress mit 2FA ein
- Nach erfolgreichem Login erzeugt das Portal einen Token
- Dieser Token wird an Access ĂŒbergeben (URL, Session, Zwischen-API)
- Access oder Middleware prĂŒft die GĂŒltigkeit
- Nur wenn gĂŒltig â Datenfreigabe
Mein Fazit
Zwei-Faktor-Login bringt nichts, wenn Access die TĂŒr offen lĂ€sst.
Darum lasse ich WordPress den SchlĂŒssel geben – und Access prĂŒft ihn bei jeder Aktion.
Der Token ist wie ein Zettel vom SchÀfer:
„Der da darf rein. Aber nur 5 Minuten lang.“
Und wenn das Schaf die Uhr vergisst – kommt’s eben nicht mehr rein.