¿Cómo puedo devolver el ID de usuario con el token en Django?

Genero tokens usando la vista predeterminada en Django:

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

Tengo un problema porque mi front-end no sabe cuál es el ID de usuario actualmente conectado.

¿Debo devolverlo con token o tal vez crear otra solicitud?

Sé que hay muchas maneras diferentes, pero me gustaría elegir la solución más óptima.

Puede anular rest_framework.authtoken.views.ObtainAuthToken.post para obtener el resultado que desea.

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()), ] 

Resultados de la muestra

 $ 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" } 

La idea aquí es anular el método de publicación de la clase de vista ObtainAuthToken. Aquí todo lo que he hecho es llamar a la clase principal para obtener el token, luego buscar ese token para encontrar el ID de usuario asociado.

Espero que ayude.

Si necesita obtener información del usuario en una página web, debe pasar la información del usuario en una respuesta de la API de inicio de sesión u otra API.

Mientras se utiliza la autenticación basada en token, después del inicio de sesión, se generan el token de acceso y el token de actualización que se entregarán al cliente en la respuesta de la API de inicio de sesión. Este token de acceso se pasará en el encabezado como:

 Authorization : Bearer  

authentication_classes = [OAuth2Authentication] colocar authentication_classes = [OAuth2Authentication] en su vista.

Esto validará que si el usuario ha iniciado sesión también podrá acceder a la información de inicio de sesión del user=request.user .

Creo que la buena práctica será devolver los detalles del usuario en la respuesta de la API de inicio de sesión.

Si su vista built_in no devuelve los detalles del usuario, puede anular el método de post de obtain_auth_token . Una vez hice esto para djangorestframework-jwt obtener el método token

 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) 

de forma predeterminada, response_data dict solo tenía detalles de token También agregué el objeto de usuario para lograr lo que está intentando hacer.