[英]How can I return user ID with token in Django?
我在 Django 中使用默认视图生成令牌:
url(r'^login/', rest_auth_views.obtain_auth_token),
我有一个问题,因为我的前端不知道当前登录的用户 ID 是什么。
我应该用令牌返回它还是创建另一个请求?
我知道有很多不同的方法,但我想选择最优化的解决方案。
您可以覆盖rest_framework.authtoken.views.ObtainAuthToken.post
以获得您想要的结果。
我的应用程序/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()),
]
示例结果
$ 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"
}
这里的想法是覆盖ObtainAuthToken 视图类的post 方法。 在这里我所做的就是调用父类来获取令牌,然后查找该令牌以找到关联的用户 ID。
希望有帮助。
我认为最好的做法是在登录 api 的响应中返回用户详细信息。
如果您的 built_in 视图没有返回用户详细信息,您可以覆盖obtain_auth_token
的 post 方法。 我曾经为 djangorestframework-jwt 获取令牌方法做过这个
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)
默认情况下, response_data
dict 只有token
详细信息,我还添加了用户对象以实现您要执行的操作。
如果您需要获取网页上的用户信息,则需要在 Login API 或其他 API 的响应中传递用户信息。
使用基于令牌的身份验证时,登录后会生成访问令牌和刷新令牌,这些令牌应在登录 API 响应中提供给客户端。 此访问令牌应在标头中传递为:
Authorization : Bearer <insert token here>
您需要将authentication_classes = [OAuth2Authentication]
放在您的视图中。
这将验证用户是否已登录,您还可以通过user=request.user
访问登录用户的信息。
我需要的不仅仅是带有令牌的用户 ID,所以我编写了代码来返回整个用户对象:
*我使用自定义用户,因此如果您使用的是 django 默认用户,请将模型和序列化程序更改为默认值。
from users.serializers import CustomUserSerializer
from users.models import CustomUser
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'])
user = CustomUser.objects.get(id=token.user_id)
return Response({'token': token.key, 'user': CustomUserSerializer(user).data})
多亏了这个线程,这很容易! 希望我的回答也能节省别人的时间。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.