2016-11-15 1 views
1

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)

Répondre

0

que j'étais Turns sur la bonne voie. Il est très important d'inclure l'ID de session que le client a obtenu lors de la connexion dans la nouvelle requête au serveur central.
Voici le code:

url = settings.CENTRAL_SERVER_URL + 'path/to/endpoint' 

http_x_token = request.META['HTTP_X_CSRFTOKEN'] 
csrftoken = request.COOKIES['csrftoken'] 
session_id = request.COOKIES['sessionid'] 

response = requests.post(url, data=data, 
    headers={'X-CSRFToken': http_x_token, 'Referer': url}, 
    cookies={'csrftoken': csrftoken, 'sessionid': session_id}) 

L'ID de session devrait toujours être présent dans la demande du client.
SessionMiddleware dans Django vérifie pour cela. Si l'ID de session est présent, l'utilisateur peut être trouvé et tout le reste fonctionne comme si je faisais une requête auprès du client.