Django DRF avec oAuth2 à l'aide de DOT (django-oauth-trousse à outils)

<!-J'essaie de faire fonctionner DRF avec OAuth2 (django-oauth-toolkit).

je me concentre sur http://httplambda.com/a-rest-api-with-django-and-oauthw-authentication/

J'ai d'abord suivi cette instruction, mais plus tard, après avoir eu des erreurs d'authentification, j'ai configuré cette démo: https://github.com/felix-d/Django-Oauth-Toolkit-Python-Social-Auth-Integration

le résultat était le même: Je ne pouvais pas générer de token d'accès en utilisant ceci 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/

j'ai eu cette erreur:

{"error": "unsupported_grant_type"}

l'application oAuth2 a été définie avec le mot de passe grant_type. J'ai changé grant_type en "vérification des références des clients" et j'ai essayé ce curl:

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

cela a fonctionné et j'ai obtenu le jeton auth généré.

Après que j'ai essayé d'obtenir une liste de toutes les bières:

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

Et j'ai eu cette réponse:

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

Ceci est le contenu de views.py qui devrait montrer l' bières:

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)

Je ne suis pas sûr de ce qui peut être le problème ici. D'abord avec" unsuported grant type " et plus tard avec un autre appel curl. Cela m'est également arrivé lorsque j'ai suivi le tutoriel de base de django-oauth-toolkit. J'utilise Django 1.8.2 et python3.4

merci de votre aide!

<!--7-settings.py on dirait que c'est

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

SECRET_KEY = 'hd#x!ysy@y+^*%i+klb)o0by!bh&7nu3uhg+5r0m=x$a!j@9'

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'}
}
16
demandé sur bla0009 2015-06-16 01:25:45

2 réponses

j'ai essayé la démo que vous avez mentionnée et tout allait bien.

$ 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/
[]

dans votre cas, je pense, vous avez créé la demande avec le mauvais "type de subvention D'autorisation".

utiliser les paramètres de cette application:

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