Nous avons cette configuration:même utilisateur de se connecter au serveur Django client Angular2 et un autre serveur Django
- serveur Django Central, CSRF et connexion activée. À l'exception de la connexion, aucune action ne peut être effectuée sans se connecter auparavant.
- Un client Angular2 qui se connecte pour presque tous les appels au serveur central. La connexion sur le serveur central est exécutée à partir d'ici. Le jeton CSRF est disponible et l'authentification fonctionne.
- Un autre petit serveur qui prend des fichiers. C'est aussi Django mais pas CSRF activé. Le client envoie des fichiers à ce serveur que le serveur central peut ne jamais posséder ou même voir. Le téléchargement de fichier (à l'aide de formulaire-données et POST) fonctionne correctement. Cependant, après le téléchargement d'un fichier, nous aimerions que ce petit serveur appelle le serveur central pour le notifier du téléchargement réussi.
Le problème est la dernière étape. Le serveur central refuse l'appel, disant que nous devons être connecté. Pouvons-nous en aucun cas faire croire au serveur central que la requête provient de l'utilisateur qui s'est connecté avec le client Angular2? Comment devons-nous configurer le jeton CSRF? Nous envoyons le jeton CSRF de l'utilisateur qu'il a reçu dans le client au petit serveur.
Nous utilisons la bibliothèque de requêtes python, Python 3 et Django 1.10. Ce est le code que nous avons actuellement sur le petit serveur:
url = settings.CENTRAL_SERVER_URL + 'path/to/endpoint'
# 'request' is the original request object from the Angular2 client
token = get_token(request)
# Call to 'post' results in error code in response ('not logged in')
response = requests.post(url, data=data, headers={'X-CSRFToken': token, 'Referer': url})
Je suppose que le problème est la définition de « têtes ». Peut-il être fait du tout?
(CSRF activé = utilise CsrfViewMiddleware)