【问题标题】:How to include Token in Header using Django Rest Framework如何使用 Django Rest 框架在 Header 中包含 Token
【发布时间】:2021-08-25 04:44:22
【问题描述】:

我正在使用 Token Authentication 使用 Django REST Framework。我在User Registration 期间生成了一个新令牌。我需要将此令牌传递给前端,包括header这些是我的代码:

settings.py:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'rest_framework.authtoken',
    ...
]

urls.py:(项目级)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('accounts.urls')),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),

]

urls.py:(应用级)

urlpatterns = [
    path('signup/', views.Register.as_view({"post":"register"}), name='users'),
    path('login/', views.Login.as_view({"post":"create"}), name='login'),
    path('profile/', views.Profile.as_view({"get":"list"}), name='profile'),

]

views.py:

# Register View
class Register(viewsets.GenericViewSet, mixins.CreateModelMixin,):
   serializer_class = UserRegisterSerializer

   def register(self, request):

      data_dict = self.request.data

      firstname = data_dict['firstname']
      lastname = data_dict['lastname']
      username = data_dict['username']
      email = data_dict['email']
      password = data_dict['password']
      mobile = data_dict['mobile']

      data = userRegistrationModel.objects.create(firstname=firstname, lastname=lastname, username=username, email=email, password=password, mobile=mobile)

      if data:
          user = data.set_password(password)
          data.save()
          token = Token.objects.create(user=data)

          return Response({"message": "Registered Successfully", "code": "HTTP_201_CREATED", "Token": token.key})
      else:
          return Response({"message": "Sorry Try Next Time!!!",  "code": "HTTP_403_FORBIDDEN"})



# Login View
class Login(viewsets.GenericViewSet, mixins.CreateModelMixin,):
    permission_classes = (AllowAny,)
    serializer_class = UserLoginSerializer

    def create(self, request, *args, **kwargs):

        data_dict = self.request.data

        email = data_dict['email']
        password = data_dict['password']

        data = authenticate(email=email, password=password)

        if data:
            users = Token.objects.filter(user=data).first()

            userData = UserRegisterSerializer(data)

            return Response({"message": "Login Successfully",  "code": "HTTP_200_OK", "token": users.key, "user": userData.data})

        else:
            return Response({"message": "Invalid Login",  "code": "HTTP_401_UNAUTHORIZED"})


# Profile View
class Profile(viewsets.ViewSet):
    permission_classes = (IsAuthenticated,)
    serializer_class = UserProfileSerializer

    def list(self, request, pk):
        queryset = userRegistrationModel.objects.get(id=pk)
        serializer_class = UserProfileSerializer
        ...
        ...

This is screenshot of generating the Token

直到这里(在生成新令牌时)它工作得很好。现在,当我在 LoginView 中是 including this Token 时,它不会验证。

有没有最好的方法to send this Token 到前端通过包含在标头或if we can update 以前的令牌通过新令牌in Login View

我不知道如何使用Django REST Framework 默认authtoken。请指导我使用基于令牌的身份验证的标准流程是什么。

【问题讨论】:

    标签: python mysql django django-rest-framework rest


    【解决方案1】:

    您需要在 Django REST 框架中传递这样的令牌。

    KEY :  Authorization
    VALUE : Token <token-value>
    

    在你的例子中

    return Response(
        {
            "message": "Login Successfully",
            "code": "HTTP_200_OK",
            "Authorization": "Token "+users.key,
            "user": userData.data
        }
    )
    

    curl -X GET http://127.0.0.1:8000/api/example/ -H '授权: 令牌 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b'

    参考这个https://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication

    【讨论】:

    • 感谢您的回答。请在 Postman 中测试时告诉我一件事,那么授权下的 API 类型应该是什么?就像我们有 API Key、Basic Auth、Bearer Token 等选项一样。
    • 我也在命令提示符下试过这个:curl -X GET http://127.0.0.1:8000/api/profile/ -H 'Authorization: Token b0f99371041ac66c1bab31cbc6c6a1f510faf53e' 但它给出的错误为{"detail":"Authentication credentials were not provided."}curl: (6) Could not resolve host: Token curl: (6) Could not resolve host: b0f99371041ac66c1bab31cbc6c6a1f510faf53e'
    猜你喜欢
    • 1970-01-01
    • 2017-08-19
    • 2016-03-23
    • 2020-10-29
    • 2020-10-21
    • 2019-06-07
    • 2021-12-28
    • 2018-04-08
    • 2021-12-05
    相关资源
    最近更新 更多