как получить индивидуальный пользовательский API с помощью django rest Framework knox - PullRequest
0 голосов
/ 17 марта 2020

До того, как я внедрил аутентификацию токена, он нормально работал для каждого пользователя,

GET: http://localhost:8000/users/1/  
 {
        "url": "http://localhost:8000/users/1/",
        "id": 1,
        "username": "foo",
        "boards": [
            "http://localhost:8000/boards/15/"
        ]
    },

После того, как я внедрил knox аутентификацию токена,

#settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ('knox.auth.TokenAuthentication',),
}

#users/views.py
class UserDetail(generics.RetrieveAPIView):
    permission_classes = [permissions.IsAuthenticated]
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get_object(self):
        return self.request.use

#users/urls.py
app_name = 'users'
urlpatterns = [
    path('', UserList.as_view(), name='user-list'),
    path('<int:pk>/', UserDetail.as_view(), name='user-detail'),
    path('accounts/register/', RegistrationAPI.as_view(), name='user-register'),
    path('accounts/login/', LoginAPI.as_view(), name='user-login'),
    path('accounts/logout/', knox_views.LogoutView.as_view(), name='user-logout'),

]

urlpatterns = format_suffix_patterns(urlpatterns)

# users/serializer.py
class UserSerializer(serializers.HyperlinkedModelSerializer):

    boards = serializers.HyperlinkedRelatedField(
        view_name='board:board-detail',
        lookup_field='pk',
        many=True, 
        queryset=Board.objects.all()
    )
    url = serializers.HyperlinkedIdentityField(
        read_only=True,
        lookup_field='pk',
        view_name="users:user-detail")


    class Meta:
        model = User
        fields = ('url', 'id', 'username', 'boards')

class CreateSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(
        read_only=True,
        lookup_field='pk',
        view_name="users:user-detail")

    def create(self, validated_data):
        user = User.objects.create_user(
            validated_data['username'], None, validated_data['password']
        )
        return user
    class Meta:
        model = User
        fields = ('url', 'id', 'username', 'password')

class LoginUserSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()

    def validate(self, data):
        user = authenticate(**data)
        if user and user.is_active:
            return user
        raise serializers.ValidationError("unable to log in with provided credential")

# project/urls.py
urlpatterns = [
    path('boards/', include('apps.board.urls', namespace='board')),
    path('admin/', admin.site.urls),
    path('users/', include('apps.users.urls', namespace='users')), # detail of users
    path(r'^users/accounts/', include('knox.urls')), # detail of users
]

Теперь я получаю 401 ошибка,

GET: http://localhost:8000/users/1/
{
    "detail": "Authentication credentials were not provided."
}

Четный, POST:http://localhost:8000/logout/ имеет такую ​​же 401 несанкционированную ошибку. Сначала я попробовал login, а затем logout, но все равно получаю ту же ошибку. Почему я получаю несанкционированный EDIT После того, как я POST логин, я получил токен, и я передаю этот токен в заголовок 1) ПОЛУЧИТЬ индивидуального пользователя (http://localhost: 8000 / users / 1 / , 2) POST выход из системы (http://localhost: 8000 / пользователи / учетные записи / выход из системы / Но я все равно получаю такой же 401 Unauthorized статус

1 Ответ

0 голосов
/ 18 марта 2020

Для тех, кто только начинает пользоваться почтальоном,

  1. Получить токен при входе в систему POST
  2. Переключить режим в режим GET
  3. В сеансе заголовков, ключ: значение авторизации: токен xxxxx (токен с шага 1)

тогда отправьте этот запрос.

...