2015-06-15 5 views
16

Próbuję zrobić DRF pracować z oAuth2 (django-oauth-toolkit).Django DRF z oAuth2 za pomocą DOT (django-oauth-toolkit)

byłem koncentrując się na http://httplambda.com/a-rest-api-with-django-and-oauthw-authentication/

pierwszy po tej instrukcji, ale później, po otrzymaniu błędy uwierzytelniania, ja setup to demo: https://github.com/felix-d/Django-Oauth-Toolkit-Python-Social-Auth-Integration

Wynik był taki sam: nie mogę wygenerować token dostępu z wykorzystaniem to curl:

curl -X POST -d "grant_type=password&username=<user_name>&password=<password>" -u "<client_id>:<client_secret>" http://127.0.0.1:8000/o/token/ 

mam ten błąd:

{"error": "unsupported_grant_type"} 

Aplikacja oAuth2 została ustawiona z hasłem grant_type. Zmieniłem grant_type na "poświadczenia klienta" i próbowałem tego curl:

curl -X POST -d "grant_type=client_credentials" -u "<client_id>:<client_secret>" http://127.0.0.1:8000/o/token/ 

To działało i zostałem wygenerowany token uwierzytelniania.

Potem starałem się uzyskać listę wszystkich piw:

curl -H "Authorization: Bearer <auth_token>" http://127.0.0.1:8000/beers/ 

I mam tej odpowiedzi:

{"detail":"You do not have permission to perform this action."} 

To jest treść views.py, które powinny pokazać piwa:

from beers.models import Beer 
from beers.serializer import BeerSerializer 
from rest_framework import generics, permissions 

class BeerList(generics.ListCreateAPIView): 
    serializer_class = BeerSerializer 
    permission_classes = (permissions.IsAuthenticated,) 

    def get_queryset(self): 
     user = self.request.user 
     return Beer.objects.filter(owner=user) 

    def perform_create(self, serializer): 
     serializer.save(owner=self.request.user) 

Nie jestem pewien, co może być jej problemem mi. Najpierw z "nieuporządkowanym typem grantu", a później z innym wywołaniem curl. Zdarzyło mi się to również, gdy zrobiłem podstawowy samouczek z django-oauth-toolkit. Używam Django 1.8.2 i python3.4

Dzięki za pomoc!

Moja settings.py wygląda to

import os 
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 

SECRET_KEY = 'hd#[email protected]+^*%i+klb)o0by!bh&[email protected]' 

DEBUG = True 

TEMPLATE_DEBUG = True 

ALLOWED_HOSTS = [] 

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth', 
) 

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 

    'oauth2_provider', 
    'rest_framework', 
    'beers', 
) 

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', 
) 
ROOT_URLCONF = 'beerstash.urls' 

WSGI_APPLICATION = 'beerstash.wsgi.application' 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 

LANGUAGE_CODE = 'en-us' 

TIME_ZONE = 'UTC' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 

STATIC_URL = '/static/' 

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'oauth2_provider.ext.rest_framework.OAuth2Authentication', 
    ) 
} 

OAUTH2_PROVIDER = { 
    # this is the list of available scopes 
    'SCOPES': {'read': 'Read scope', 'write': 'Write scope'} 
} 
+0

co ma ustawienia wyglądać? czy wszystkie ustawienia oauth zostały dodane do użycia jako uwierzytelnianie API REST Framework API? –

+0

@AlexT Dodałem plik settings.py – bla0009

Odpowiedz

8

próbowałem demo wspomniałeś i wszystko było w porządku.

$ curl -X POST -d "grant_type=password&username=superuser&assword=123qwe" -u"xLJuHBcdgJHNuahvER9pgqSf6vcrlbkhCr75hTCZ:nv9gzOj0BMf2cdxoxsnYZuRYTK5QwpKWiZc7USuJpm11DNtSE9X6Ob9KaVTKaQqeyQZh4KF3oZS4IJ7o9n4amzfqKJnoL7a2tYQiWgtYPSQpY6VKFjEazcqSacqTx9z8" http://127.0.0.1:8000/o/token/ 
{"access_token": "jlLpKwzReB6maEnjuJrk2HxE4RHbiA", "token_type": "Bearer", "expires_in": 36000, "refresh_token": "DsDWz1LiSZ3bd7NVuLIp7Dkj6pbse1", "scope": "read write groups"} 
$ curl -H "Authorization: Bearer jlLpKwzReB6maEnjuJrk2HxE4RHbiA" http://127.0.0.1:8000/beers/ 
[] 

W twoim przypadku, jak sądzę, utworzyłeś aplikację z nieprawidłowym "typem przyznania zezwolenia".

Użyj ustawień tej aplikacji:

Name: just a name of your choice 
Client Type: confidential 
Authorization Grant Type: Resource owner password-based 

Ten https://django-oauth-toolkit.readthedocs.org/en/latest/rest-framework/getting_started.html#step-3-register-an-application halped mi wiele.

Tutaj plik bazy danych stworzyłem: https://www.dropbox.com/s/pxeyphkiy141i1l/db.sqlite3.tar.gz?dl=0

Można spróbować samemu. W ogóle nie zmieniono kodu źródłowego. Django admin username - superuser, hasło - 123qwe.

+0

Cześć Yevgeniy, dziękuję za odpowiedź - przetestuję to i skontaktuję się z Tobą! – bla0009

+1

Przetestowałem to ponownie - z ustawieniami, jak powiedziałeś i działało! Dzięki za wskazanie tego! – bla0009

2

Podczas korzystania z "poświadczeń klienta" nie ustawia użytkownika na wygenerowanym tokenie dostępu, jest to przyczyna tego błędu, który widzisz.

Podczas korzystania z subskrypcji client credentials należy ustawić obsługę uprawnień Rest Framework, aby sprawdzać tokeny, ponieważ client credentials nie ustawia użytkownika na wygenerowanym tokenie. Django OAuth Toolkit zapewnia uprawnienia niestandardowe do tego celu:

https://django-oauth-toolkit.readthedocs.org/en/latest/rest-framework/permissions.html

Lub jeśli całe API jest przedmiotem tego samego rodzaju uprawnień można po prostu ustawić obsługi uprawnień globalnie w pliku settings.py, na przykład:

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'oauth2_provider.ext.rest_framework.OAuth2Authentication', 
    ), 

    'DEFAULT_PERMISSION_CLASSES': (
     'oauth2_provider.ext.rest_framework.TokenHasReadWriteScope', 
    ) 
} 

Zakłada to oczywiście, że udzielasz wtedy zezwoleń na read write.

Więcej informacji o zakresach tutaj:

https://django-oauth-toolkit.readthedocs.org/en/latest/settings.html