2017-06-09 2 views
1

I erzeugen Token Standardansicht in Django:Wie kann ich Benutzer-ID mit Token in Django zurückgeben?

url(r'^login/', rest_auth_views.obtain_auth_token), 

Ich habe ein Problem, weil mein Front-End nicht weiß, was die zur Zeit in Benutzer-ID angemeldet ist.

Sollte ich es mit Token zurückgeben oder vielleicht eine andere Anfrage erstellen?

Ich weiß, dass es viele verschiedene Möglichkeiten gibt, aber ich würde gerne die optimale Lösung wählen.

Antwort

3

Sie können rest_framework.authtoken.views.ObtainAuthToken.post überschreiben, um das gewünschte Ergebnis zu erhalten.

myapp/views.py

from rest_framework.authtoken.views import ObtainAuthToken 
from rest_framework.authtoken.models import Token 
from rest_framework.response import Response 


class CustomObtainAuthToken(ObtainAuthToken): 
    def post(self, request, *args, **kwargs): 
     response = super(CustomObtainAuthToken, self).post(request, *args, **kwargs) 
     token = Token.objects.get(key=response.data['token']) 
     return Response({'token': token.key, 'id': token.user_id}) 

myapp/urls.py

from django.conf.urls import url 

from .views import CustomObtainAuthToken 

urlpatterns = [ 
    url(r'^authenticate/', CustomObtainAuthToken.as_view()), 
] 

Probenergebnisse

$ http :8000/authenticate/ username=someuser password=secretpassword 
HTTP/1.0 200 OK 
Allow: POST, OPTIONS 
Content-Language: en 
Content-Type: application/json 
Date: Tue, 22 Mar 2017 18:30:10 GMT 
Server: WSGIServer/0.2 CPython/3.5.1 
Vary: Accept-Language, Cookie 
X-Frame-Options: SAMEORIGIN 

{ 
    "id": 16, 
    "token": "82e0bc9980a6b2c9a70969b0f8dc974418dda399" 
} 

Die Idee, die er re ist es, die post-Methode der ObtainAuthToken-Sichtklasse zu überschreiben. Hier habe ich nur die Elternklasse aufgerufen, um das Token zu erhalten, und dann das Token nachgeschlagen, um die zugehörige Benutzer-ID zu finden.

Hoffe, dass hilft.

+0

Ja, es hat geholfen. Genau das wollte ich erreichen. Ich hoffe, dass dies eine konsequente Lösung mit den richtigen Gewohnheiten ist. – wahtdbogh

1

Wenn Sie Benutzerinformationen auf einer Webseite abrufen müssen, müssen Sie Benutzerinformationen in einer Antwort der Login-API oder einer anderen API übergeben.

Bei der Token-basierten Authentifizierung werden nach der Anmeldung ein Zugriffstoken und ein Aktualisierungstoken generiert, die dem Client in der API-Antwort für die Anmeldung übergeben werden.

Authorization : Bearer <insert token here> 

Sie benötigen authentication_classes = [OAuth2Authentication] Ihrer Ansicht nach setzen: Diese Zugriffstoken wird wie in Header übergeben werden.

Dies wird validieren, wenn der Benutzer angemeldet ist, erhalten Sie Zugriff auf die Informationen des angemeldeten Benutzers von user=request.user.

0

Ich denke, die gute Praxis wird sein, Benutzerdetails in der Antwort von Login API zurückzugeben.

Wenn Ihre Ansicht "built_in" keine Benutzerdetails zurückgibt, können Sie die Post-Methode von obtain_auth_token überschreiben. Ich tat dies einmal für djangorestframework-jwt Token Methode

def post(self, request, *args, **kwargs): 
    serializer = self.get_serializer(data=request.data) 

    if serializer.is_valid(): 
     user = serializer.object.get('user') or request.user 
     token = serializer.object.get('token') 
     response_data = { 
      'token': token, 
      'user': UserSerializer(user).data 
     } 
     response = Response(response_data, status=status.HTTP_200_OK) 
     if api_settings.JWT_AUTH_COOKIE: 
      expiration = (datetime.utcnow() + 
          api_settings.JWT_EXPIRATION_DELTA) 
      response.set_cookie(api_settings.JWT_AUTH_COOKIE, 
           response.data['token'], 
           expires=expiration, 
           httponly=True) 
     return response 

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

standardmäßig response_data dict erhalten hatte nur token Details i Benutzerobjekt als auch hinzugefügt, um zu erreichen, was Sie zu tun versuchen.

Verwandte Themen