Ich habe zwei Websites, einen WordPress-Blog, der den Großteil des Inhalts hostet. Ich habe auch eine API mit Flask geschrieben. Ich möchte die API in WordPress nutzen (eine passwortgeschützte Seite), aber ich muss überprüfen, ob die Anfrage authentifiziert ist, bevor ich von Flask aus antworte.
Wie kann ich überprüfen, ob ein Benutzer von WordPress angemeldet ist, wenn ich eine Anfrage an die Flask-API erhalte?
Für zusätzliche Sicherheit können wir die Annahme von Anfragen von bestimmten Domains wie Ihrer WordPress-Seite einschränken, ein Ablaufdatum hinzufügen oder das Widerrufen eines Schlüssels zulassen.
ricardkelly
Mir ist nicht klar, ob Sie direkt zwischen WordPress und der Flask-App kommunizieren (dh eine Server-zu-Server-API) oder ob Sie möchten, dass der Browser, der eine WordPress-Seite anzeigt, dann eine in der Flask-App gehostete API aufruft. Wenn ersteres der Fall ist, könnte die von hungtran273 beschriebene API-Schlüsselmethode für Sie gut funktionieren.
Diese Antwort konzentriert sich auf Letzteres (JS im Browser, das der Flask-App die WordPress-Identität nachweist). Dieses Plugin verwendet einen privaten Schlüssel, um ein JWT für die Benutzeranmeldung zu erstellen. Dadurch wird das Hinzufügen eines API-Schlüssels pro Benutzer vermieden. Die Flask-App kann dann den zugehörigen öffentlichen Schlüssel verwenden, um das JWT zu überprüfen.
Wie bereits geschrieben, erfordert dies, dass Sie den privaten Schlüssel im PEM-Format in dasselbe Verzeichnis wie das Plugin legen, was bei der Verwendung in der Produktion keine gute Praxis ist.
Der Code gibt eine Skriptfunktion aus, die Sie von einer anderen Stelle auf Ihrer Seite aufrufen können, um das JWT für die Übergabe an die Flask-API abzurufen. Es gibt auch einen Kommentar aus, der Ihnen nur die signierten Informationen gibt, die Sie wahrscheinlich aus dem Plugin entfernen würden, nachdem Sie überprüft haben, dass es die erwarteten Informationen liefert.
Hier ist eine Flask-App, die das JWT-Token im Authorization-Header verwendet.
app.py
from flask import Flask, jsonify, request
from functools import wraps
import jwt
app = Flask(__name__)
public_key = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArKY5qH99Ouc/M/egCu6Z
ignTibNPXjNMOK2JYF00ytkfvafqMLuKrEjfExs6U+VQxqQQ4ZyzG/owaqht/zlR
aNhJMJOf0GA5EjtrT++uLh5k5MkA+hgWkRqIB869vctEpUSWzSOwOAR1OFoRXDAR
eESAw+LM4U/o9jq7A9IkgrgpoTC2F5th3ps4Sm7d2xiCLxyRWBmHHTYm7xaybOMe
xA7RzJCT04eUWwobYXdpvfhL8+izOuQlaA1+/dMCnaUWLModULgDlQFYDItULLNk
CF9UkrfpwYJUsO6oP/Ue7GvqtRHYkOfTh5GKtmB+pSlCuc+k+IPbeq6ljHFOLFTl
kQIDAQAB
-----END PUBLIC KEY-----
"""
def token_required(f):
@wraps(f)
def decorator(*args, **kwargs):
token = None
if 'Authorization' in request.headers:
token = request.headers['Authorization']
token = token.replace('Bearer','').strip()
if not token:
return jsonify({'message': 'a valid token is missing'})
try:
data = jwt.decode(token, public_key, algorithms=["RS256"])
current_user = data['sub']
except Exception as ex:
return jsonify({'message': 'token is invalid'})
return f(current_user, *args, **kwargs)
return decorator
@app.route('/api/<id_value>')
@token_required
def api_call(current_user, id_value):
return jsonify({'message': f'id provided was {id_value} by {current_user}'})
if __name__ == '__main__':
app.run(host="0.0.0.0", port="5000")
Habe ein besseres WP-Plugin basierend auf der obigen Skizze geschrieben, das die Sicherheit des privaten Schlüssels aufrechterhält. Es ist ziemlich viel länger als der obige Beispielcode, aber wenn jemand es oder irgendeinen Code daraus verwenden möchte – github.com/ricardkelly/wordpress_JWT_Publish
– Ricardo
vor 3 Stunden
14379400cookie-checkAuthentifizierung der Flask-API mit WordPressyes