Feature #455

Ενσωμάτωση AAI στο UI

Added by Constantinos Venetsanopoulos almost 13 years ago. Updated almost 13 years ago.

Status:Closed Start date:05/05/2011
Priority:High Due date:
Assignee:Markos Gogoulos % Done:

0%

Category:Cyclades UI Spent time: -
Target version:v0.3

Description

Ξανανοίγει το σβησμένο ticket #425. Στο update που ακολουθεί βρίσκεται όλο το history του #425. Συνεχίζουμε εδώ

Associated revisions

Revision cabf8482
Added by Markos Gogoulos almost 13 years ago

change X_AUTH_TOKEN to X_Auth_Token

On ui. Refs #455

Revision 8b17cf6e
Added by Markos Gogoulos almost 13 years ago

fix authentication on the ui

Sets X-Auth-Token value on a cookie, for every api call
Refs #455

Revision be066a83
Added by Markos Gogoulos almost 13 years ago

fix authentication on the ui

if cookie with value X-Auth-Token exists, set the value on the headers.
Otherwise set the cookie with value X-Auth-Token
Refs #455

History

#1 Updated by Constantinos Venetsanopoulos almost 13 years ago

Author: Giorgos Gousios
Status: Assigned
Priority: High
Assigned to: Dimitris Moraitis
Category: GUI
Target version: v0.3

  • Καταγραφή του Χ-Auth-Token
  • Σε κάθε request πρέπει να τίθεται το header X-Auth-Token

----
----

Issue #425 has been updated by Vangelis Koukis.

Status changed from New to Assigned
Priority changed from Medium to High

Στο 40777cc83 [δείτε #423], ο [verigak] έχει επεκτείνει το API ώστε να
απαιτεί tokens.
Οπότε για να κλείσει το #425, παρακαλώ κάντε merge το branch api-current στο ui-0.3
[εκεί θα σπάει το Web UI], και προχωρήστε όπως προτείνεται στη σημείωση 1 παραπάνω,
ώστε η εφαρμογή να παίξει σωστά, με χρήστες.

Το command-line εργαλείο tools/cloud στο api-current χρησιμοποιεί ένα hardcoded
token αυτή τη στιγμή.

----
----

Issue #425 has been updated by Markos Gogoulos.

Μετά το merge υπάρχουν αρκετές αλλαγές που χρειάζονται διευκρινίσεις. Το
settings.py.dist έχει αλλάξει. Θα πρέπει να αντιγράψουμε τις αλλαγές που αφορούν τα
MIDDLEWARE_CLASSES (πχ χρήση της synnefo.aai.middleware.SynnefoAuthMiddleware);

----
----

Issue #425 has been updated by Markos Gogoulos.

Επίσης πρέπει να γίνουν loaddata τα aai/fixtures για να υπάρχει κάποιος χρήστης, και
το AUTH_TOKEN_DURATION να είναι κάτι μεγάλο (πχ 43800) γιατί αλλιώς το θεωρεί
expired και σε πηγαίνει για login στο grnet sibboleth.

Σημείωση: στο api/images.py, η list_images δείχνει μόνο τα images του χρήστη, οπότε
επιστρέφει μηδέν και δεν μπορεί να παίξει ο wizzard.

----
----

Issue #425 has been updated by Giorgos Gousios.

Προφανώς χρησιμοποιούμε το τελευταίο setttings.py.dist που έχει κάθε φορά το branch
το οποίο κάνουμε merge. Τα fixtures δεν φορτόνωνται αυτόματα διότι είναι fixtures
(==προσωρινά/test δεδομένα). Γενικά, θα πρότεινα να κινηθείτε ως εξής:

  1. Να δοκιμάσετε να στέλνετε στην αρχή ένα πλασματικό X-Auth-Token (προφανώς
    τροποιώντας όλα τα REST call σας)
  2. Αφού φορτώσετε το fixture, να δοκιμάσετε να κάνετε login όπως προδιαγράφεται από
    το RackSpace API (X-Auth-User, X-Auth-Key). Αφού σας επιστραφεί το X-Auth-Token,
    δοκιμάστε να το αποθηκεύσετε σε cookie.
  3. Γενικά, το web interface , δεν ξέρει πότε χρειάζεται καινούργιο token ούτε θα
    έπρεπε. Η Javascript θα πρέπει να αποθηκεύει ότι καινούργιο X-Auth-Token βλέπει όταν
    το API γυρίσει 204 σε cookie και να χρησιμοποιεί αυτό σε όλες τις κλήσεις μετά.

Κανονικό testing μπορεί να γίνει μόνο στην πραγματική εγκατάσταση του συστήματος,
λόγω sibboleth.

----
----

Issue #425 has been updated by Markos Gogoulos.

Το aai/fixtures/auth_test_data.json πρέπει να φορτωθεί για να υπάρξει ο χρήστης,
αλλιώς το σύστημα πηγαίνει στο sibboleth για login.

Για την ώρα δίνουμε χειροκίνητα το HTTP_X_AUTH_TOKEN στην
middleware.SynnefoAuthMiddleware.process_request(self, request) και μόλις αυτό μπει
σε όλες τις κλήσεις θα φύγει από εκεί.

Μιας και έχει αλλάξει ο μηχανισμός των Images (περιλαμβάνει παντού το request.user
πλεον), θα πρέπει να μπει ο χρήστης σαν owner, αλλιώς δεν θα υπάρχει κανένα Image
και δεν ξεκινάει καν ο wizard

Για να γίνει αυτό πρέπει να αλλάξουν τα images fixtures, εναλλακτικά:

$ ./bin/python manage.py shell
>>> from db.models import *
>>> images = Image.objects.all()
>>> for image in images:
...     image.owner = SynnefoUser.objects.all()[0]
...     image.save()

----
----

Issue #425 has been updated by Giorgos Gousios.

Το aai/fixtures/auth_test_data.json πρέπει να φορτωθεί για να υπάρξει ο χρήστης,

αλλιώς το σύστημα πηγαίνει στο sibboleth για login.

Πράγματι, για testing και μονο. Στην κανονική εγκατάσταση δεν είναι απαραίτητο, γι'
αυτό και δεν φορτώνεται αυτόματα

Για την ώρα δίνουμε χειροκίνητα το HTTP_X_AUTH_TOKEN στην

middleware.SynnefoAuthMiddleware.process_request(self, request) και μόλις αυτό
μπει σε όλες τις κλήσεις θα φύγει από εκεί.

Τι εννοείς?

> Μιας και έχει αλλάξει ο μηχανισμός των Images (περιλαμβάνει παντού το
request.user πλεον), θα πρέπει να μπει ο χρήστης σαν owner, αλλιώς δεν θα υπάρχει
κανένα Image και δεν ξεκινάει καν ο wizard

Οκ, αυτό πρέπει να το δει ο [verigak]

----
----

Issue #425 has been updated by Markos Gogoulos.

Status changed from Assigned to Feedback

Το merge του branch api-current στο ui-0.3 έγινε. Μετά από αυτό θα χρειαστεί
δημιουργία καινούργιας βάσης, γιατί υπάρχουν καινούργια πεδία στα models.py και το
migrate δεν δούλεψε (τουλάχιστον σε μένα). Οπότε χρειάστηκα δημιουργία καινούργιας
βάσης, loaddata images, flavors και aai/fixtures, μεταφορά του settings.py.dist και
αλλαγή του AUTH_TOKEN_DURATION = 43800

----
----

Issue #425 has been updated by Christos Psaltis.

ούτε σε μένα δούλεψε το migrate με την postgres

----
----

Issue #425 has been updated by Vangelis Koukis.

Markos Gogoulos wrote:

Το merge του branch api-current στο ui-0.3 έγινε. Μετά από αυτό θα χρειαστεί

δημιουργία καινούργιας βάσης, γιατί υπάρχουν καινούργια πεδία στα models.py και το
migrate δεν δούλεψε (τουλάχιστον σε μένα). Οπότε χρειάστηκα δημιουργία καινούργιας
βάσης, loaddata images, flavors και aai/fixtures, μεταφορά του settings.py.dist
και αλλαγή του AUTH_TOKEN_DURATION = 43800

Γιατί χρειάζεται loaddata από το aai/fixtures/; εκεί έχει μόνο test_data, δεν θα
έπρεπε να χρειάζεται.
Αν είναι αναγκαίο, ίσως είναι bug του κώδικα του Γιώργου [gousiosg], αλλά απ'ό,τι
βλέπω υπάρχει εγγραφή στο db/initial_data.json, οπότε γιατί χρειάζεται και loaddata
από το aai/fixtures;

Επίσης, γιατί χρειάζεται η αλλαγή AUTH_TOKEN_DURATION=43800; στο settings.py.dist
βλέπω AUTH_TOKEN_DURATION=24 [σε ώρες]. Αν δεν είναι ώρες, είναι bug του
settings.py.dist.

Τέλος, ΟΚ, δεν έπαιξε το migration, αλλά μπορείτε να στείλετε τι ακριβώς βγάζει ώστε
να το φανεί τι συμβαίνει και ποιος πρέπει να το αναλάβει; Προσωπικά δεν το έχω
δοκιμάσει ακόμη.

----
----

Issue #425 has been updated by Markos Gogoulos.

Η τιμη AUTH_TOKEN_DURATION=24 χρειάζεται γιατι το aai/middleware.py τσεκάρει πότε
δημιουργήθηκε το auth_token και αν είναι παλιό σε πηγαίνει στο shiboleth για login.
Οπότε για να μπορούμε να δουλέψουμε έγινε η αλλαγή αυτή. Επίσης στο
db/initial_data.json λείπει το πεδίο auth_token_created

----
----

Issue #425 has been updated by Markos Gogoulos.

συγνώμη, η αλλαγή του AUTH_TOKEN_DURATION από 24 σε κάτι μεγαλύτερο εννοώ

----
----

Issue #425 has been updated by Giorgos Gousios.

Νομίζω ότι το migrate με την postgres δεν έχει προβλημα. Αν μη τι άλλο, ο Jenkins το
έκανε αυτόματα...

http://buildbot.dev.grnet.gr/job/synnefo-postgres/145/console (το πρόβλημα είναι στα
fixtures όχι στο migration)

Αν κάνω λάθος, παρακαλώ στείλτε το output του migrate

----
----

Issue #425 has been updated by Giorgos Gousios.

Markos Gogoulos wrote:

Η τιμη AUTH_TOKEN_DURATION=24 χρειάζεται γιατι το aai/middleware.py τσεκάρει πότε

δημιουργήθηκε το auth_token και αν είναι παλιό σε πηγαίνει στο shiboleth για
login. Οπότε για να μπορούμε να δουλέψουμε έγινε η αλλαγή αυτή.

Μπορείς να το κάνεις στο τοπικό settings.py και λογικά θα δουλέψει

Επίσης στο db/initial_data.json λείπει το πεδίο auth_token_created

Έγινε λάθος στο merge με το api-branch ή στο merge του api-branch στο ui-0.3. Στο
αρχικό branch (auth-mechasnism) υπάρχει.

----
----

Issue #425 has been updated by Vangelis Koukis.

Markos Gogoulos wrote:

Η τιμη AUTH_TOKEN_DURATION=24 χρειάζεται γιατι το aai/middleware.py τσεκάρει πότε

δημιουργήθηκε το auth_token και αν είναι παλιό σε πηγαίνει στο shiboleth για
login. Οπότε για να μπορούμε να δουλέψουμε έγινε η αλλαγή αυτή.

Τότε ίσως θα είχε νόημα να μπορεί κανείς να έχει tokens που να μη λήγουν ποτέ [το
συγκεκριμένο]. Ή καλύτερα, κάθε token να έχει κι ένα expires field, που να παίρνει
τιμή με βάση την μεταβλητή του settings.py.dist. Για το test token θα ήταν expires =
NULL ή expires = κάπου το 2040.

Το συζητάμε με το Γιώργο αύριο.

----
----

Issue #425 has been updated by Constantinos Venetsanopoulos.

Status changed from Feedback to Assigned

Έχω κάνει merge το api-current στο ui-0.3 0για να έχουν owner τα images. Παρακαλώ
κάντε pull

----
----

Issue #425 has been updated by Christos Psaltis.

Status changed from Assigned to Feedback
Assigned to changed from Dimitris Moraitis to Markos Gogoulos

και εδώ νομίζω ότι είμαστε έτοιμοι

----
----

Issue #425 has been updated by Giorgos Gousios.

και εδώ νομίζω ότι είμαστε έτοιμοι

Τι έχει γίνει μετά την ανταλλαγή email που είχα με το Μάρκο για το θέμα? Από ότι
βλέπω κανένα .js δεν περιλαμβάνει κάτι σχετικό με authentication (grep -Ri x-auth *)
Κάνω κάτι λάθος?

----
----

Issue #425 has been updated by Markos Gogoulos.

Γιώργο αν στο middleware.py αντί για το fixed token μπει το κομμάτι

if not request.path.startswith('/api/') :
  print time.strftime("[%d/%b/%Y %H:%M:%S]"), " Path", \
              request.path , ": Not authenticated" 
  return

δεν δουλεύει, καθώς το request πια δεν περιλαμβάνει request.user και δίνει παντού

AttributeError: 'WSGIRequest' object has no attribute 'user'

----
----

Issue #425 has been updated by Giorgos Gousios.

Αυτό δεν έπρεπε να συμβαίνει, και δεν συμβαίνει στο δικό μου version του branch
ui-0.3. Τα unit tests δουλεύουν όπως και το UI. Η ιδέα είναι ότι κόβουμε από
επιπλέον επεξεργασία στο middleware οτιδήποτε δεν είναι API call.

Για να προχωρήσουμε, παρακαλώ, εξηγηστε μου γιατί δεν δουλεύει ή γιατί δεν γίνεται
να δουλέψει. Διαφορετικά, βρείτε κάποια λύση που να μην παρακάμπτει το aai και πείτε
μου τι πρέπει να υλοποιήσω.

----
----

έκανα πάντως commit που αφαιρεί την παράκαμψη με το auth_token γιατι ήταν
ιδιαίτερα άσχημο.

οπότε αυτή τη στιγμή τα api calls στέλνουν το fake auth_token

----
----

#2 Updated by Markos Gogoulos almost 13 years ago

  • Status changed from Assigned to Feedback

Στο commit d994d1189316e0eed34e6acd4f7d9eba90c17be1 έχει μπει το X_AUTH_TOKEN στα api calls

#3 Updated by Vangelis Koukis almost 13 years ago

  • Status changed from Feedback to Assigned

Τι γίνεται με αυτό το ticket;

Υπάρχουν τουλάχιστον τα εξής ακόμη:

α) το όνoμα του header είναι X-Auth-Token, όχι X_AUTH_TOKEN, όπως αναφέρεται και στον ορισμό του ticket και τις αντίστοιχες σημειώσεις. To UI πρέπει να διορθωθεί, γιατί τώρα περνάει ένα X_AUTH_TOKEN, το οποίο δεν έχει σχέση. Το αναφέρω γιατί λόγω αυτού δεν μπορώ εδώ και αρκετή ώρα να το κάνω να παίξει με τον nginx ως frontend, ο οποίος τρώει headers που δεν του φαίνονται λογικά, όπως αυτό.

β) Έχει ενταχθεί στο UI η λειτουργικότητα να λαμβάνει το token και να το αποθηκεύει σε cookie τοπικά, ώστε να το χρησιμοποιεί σε επόμενα login;

#4 Updated by Markos Gogoulos almost 13 years ago

Η αλλαγή από X_AUTH_TOKEN σε X-Auth-Token έγινε στο ui. Ωστόσο ο django runserver και ο apache (με firefox και chromium) το μετατρέπουν σε uppercase, και έτσι φτάνει στο middleware σαν HTTP_X_AUTH_TOKEN.

Στα api calls στέλνουμε λοιπόν το fake αυτό auth_token. Πώς προχωράμε με αυτό το ticket; Mας δίνετε credentials για το sibbolleth, ή στέλνουμε fake auth-user και auth-key (όπως προβλέπεται στο middleware.py);

#5 Updated by Giorgos Gousios almost 13 years ago

Στο c06de38397a5e9a πρόσθεσα υποστήριξη ώστε να αποθηκεύεται το X-Auth-Token σε cookie από την πλευρά του server και να γίνεται authentication με βάση το cookie. Μπορείς να επιβεβαιώσεις ότι δουλεύει? Εννοώ ότι το cookie τίθεται όπως πρέπει στο browser και ότι αποστέλεται σε κάθε request είτε αυτόματα (όπως θα έπρεπε) είτε χειροκίνητα.

Πρόσβαση στο sibboleth δεν γίνεται να δώσουμε. Το καλύτερο που νομίζω ότι μπορεί να γίνει είναι να έρθει κάποιος από εσάς στο ΕΔΕΤ τη δευτέρα για να φτιάξει ότι χρειάζεται επιτόπου.

#6 Updated by Giorgos Gousios almost 13 years ago

Μάρκο παρακαλώ μέχρι σήμερα το μεσημέρι να το έχεις τελειώσει, το συγκεκριμενο ticket ήδη μπλοκάρει το merge από την Παρασκευή.

#7 Updated by Markos Gogoulos almost 13 years ago

  • Status changed from Assigned to Feedback

Στο commit c06de38..8b17cf6 αντί να θέτει το X-Auth-Token στους headers, το τοποθετεί σε cookie, για τα api requests.

#8 Updated by Giorgos Gousios almost 13 years ago

Στο commit c06de38..8b17cf6 αντί να θέτει το X-Auth-Token στους headers, το τοποθετεί σε cookie, για τα api requests.

Μάρκο, αυτό το commit μπορεί να επιδιορθώνει το πρόβλημα αλλά δεν το λύνει. Το Openstack API λέει ότι το X-Auth-Token πρέπει να υπάρχει σαν header, όχι σαν cookie. Οπότε αυτό που πρέπει να κάνεις είναι το ανάποδο: να διαβάζεις το Χ-Auth-Token από το cookie που σου στέλνει ο server (όταν σου στέλνει/το έχεις) και να το θέτεις στο header.

Γενικά, βλέπω υπάρχει πρόβλημα επικοινωνίας, καθώς από ότι φαίνεται δεν έχετε καταλάβει τη λογική πίσω από το authentication. Είναι λογικό, καθώς άλλος ήταν στη συνάντηση και άλλος γράφει τον κώδικα. Το ξαναγράφω, για 5 γραμμές κώδικα έχουμε ανταλλάξει 500 γραμμές email. Καθώς αυτό είναι χρονοβόρο (έχω φάει πάνω από 5 ώρες για κάτι που μπορούσαμε να λύσουμε πολύ γρήγορα), θα πρότεινα αν δούμε ξανά κάτι τέτοιο είτε να μιλάμε στο τηλέφωνο, είτε να κάνουμε συναντήσεις συχνότερα.

#9 Updated by Giorgos Gousios almost 13 years ago

Μάρκο, δες και το παρακάτω μπορεί να σε βοηθήσει (προσοχή, δεν είναι ακόμη τελικό οπότε μην το πέρνεις τοις μετρητοις)

http://trac.cslab.ece.ntua.gr:8081/cloud/wiki/DesignAuth

#10 Updated by Markos Gogoulos almost 13 years ago

Στο commit 8b17cf6..be066a8 η λογική άλλαξε και πριν απο κάθε request το ui τσεκάρει αν υπάρχει η τιμή X-Auth-Token στο cookie. Αν ναι, τη στέλνει στους headers μαζί με το request, αλλιώς τοποθετεί στο cookie την πλασματική τιμή που έχουμε.

#11 Updated by Giorgos Gousios almost 13 years ago

  • Status changed from Feedback to Closed

Μετά το 89b6b240 το σύστημα βασίζεται αποκλειστικά σε cookies για το authentication. Το webui πρέπει απλά να διαβάζει το cookie και να το θέτει στο X-Auth-Token header για να μπορεί να κάνει κλήσεις στο API.

Σε τεστ περιβάλλον, αρκεί η κλήση του URL http://localhost:8000/?test την πρώτη φορά μόνο για να παραλάβει ο browser το cookie.

Με βάση τα παραπάνω, θεωρούμε ότι το ticket κλείνει, με την επιφύλαξη της λειτουργίας στην πραγματική εγκατάσταση του sibboleth.

Also available in: Atom PDF