2012-09-18 18 views
12

Wie funktioniert die Authentifizierung mit Tastypie APIKey? Ich weiß, dass es ein Signal gibt, wie in der Dokumentation erwähnt:Tastypie APIKey Authentifizierung

from django.contrib.auth.models import User  
from django.db import models 
from tastypie.models import create_api_key 

models.signals.post_save.connect(create_api_key, sender=User) 

Allerdings, wann heißt das? Wenn ich einem Benutzer ihren APIkey geben möchte, weiß ich, dass ich ihn in der APIKey db finden kann, dass diese create_api_key Funktion den Schlüssel hinzufügt, aber wo und wann rufe ich diese models.signals.post_save Funktion auf?

Ist das nur ein weiteres Django-Modell? Ich denke, es ist?

Wird dies jedes Mal aufgerufen, wenn ein Benutzerkonto gespeichert wird?

Antwort

18

Sie können dies in models.py Datei der entsprechenden App (wie main/) setzen. Was post_save.connect(create_api_key, sender=User) tut ist, dass jedes Mal, wenn eine User Instanz gespeichert wird, create_api_key() aufgerufen wird.

Nun wollen wir schauen in das, was create_api_key() tut durch Tauchen ein wenig in die Quelle der tastypie:

class ApiKey(models.Model): 
    user = models.OneToOneField(User, related_name='api_key') 
    key = models.CharField(max_length=256, blank=True, default='') 
    created = models.DateTimeField(default=datetime.datetime.now) 

    def __unicode__(self): 
     return u"%s for %s" % (self.key, self.user) 

    def save(self, *args, **kwargs): 
     if not self.key: 
      self.key = self.generate_key() 

     return super(ApiKey, self).save(*args, **kwargs) 

    def generate_key(self): 
     # Get a random UUID. 
     new_uuid = uuid.uuid4() 
     # Hmac that beast. 
     return hmac.new(str(new_uuid), digestmod=sha1).hexdigest() 


def create_api_key(sender, **kwargs): 
    """ 
    A signal for hooking up automatic ``ApiKey`` creation. 
    """ 
    if kwargs.get('created') is True: 
     ApiKey.objects.create(user=kwargs.get('instance')) 

Wie Sie sehen können, create_api_key() einen neuen ApiKey Datensatz erstellen, die auf die User Aufruf bezogen werden. Dieser Datensatz enthält außerdem einen HMAC-Schlüssel, wenn er in der Tabelle ApiKey gespeichert wurde. Der Schlüssel wird von Funktion generiert.

+0

genial perfekt ... danke. Also, wenn ich die Kontoinformationen eines Benutzers ändere, ändert sich auch die API-Taste (wenn das Passwort geändert wird)? –

+1

Nein, der API-Schlüssel wird nur erstellt, wenn ein neuer Benutzerdatensatz erstellt wird: https://docs.djangoproject.com/en/dev/ref/signals/#post-save. Grundsätzlich wird, wenn ein neuer 'Benutzer'-Datensatz erstellt wird, ein 'created = True'-Parameter an' create_api_key() 'gesendet, wobei beim Aktualisieren von' Benutzer' nicht 'created = True' gesetzt wird und somit die ApiKey-Erstellung nicht ausgelöst wird. –

+0

Danke. Gut zu wissen –