tutorial framework consumir python django django-rest-framework

python - framework - Django DRF con oAuth2 utilizando DOT(django-oauth-toolkit)



django rest framework serializer (2)

Estoy tratando de hacer que DRF funcione con oAuth2 (django-oauth-toolkit).

Me estaba enfocando en http://httplambda.com/a-rest-api-with-django-and-oauthw-authentication/

Primero seguí esa instrucción, pero luego, después de obtener errores de autenticación, configuré esta demostración: https://github.com/felix-d/Django-Oauth-Toolkit-Python-Social-Auth-Integration

El resultado fue el mismo: no pude generar el token de acceso usando este rizo:

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/

Tengo este error

{"error": "unsupported_grant_type"}

La aplicación oAuth2 se configuró con la contraseña de grant_type. Cambié grant_type a "credenciales de cliente" y probé este rizo:

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

Esto funcionó y me generé token de autenticación.

Después de eso traté de obtener una lista de todas las cervezas:

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

Y tengo esta respuesta:

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

Este es el contenido de views.py que debería mostrar las cervezas:

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)

No estoy seguro de cuál puede ser el problema aquí. Primero con "tipo de concesión no admitido" y luego con otra llamada de curl. Esto también me sucedió cuando hice un tutorial básico de django-oauth-toolkit. Estoy usando Django 1.8.2 y python3.4

Gracias por toda la ayuda!

Mi settings.py se ve así

import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) SECRET_KEY = ''hd#x!ysy@y+^*%i+klb)o0by!bh&7nu3uhg+5r0m=$3x$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''} }


Cuando usa "credenciales de cliente", no establece al usuario en el token de acceso generado, esta es la raíz de la que you do not have permission error de you do not have permission que está viendo.

Al usar el tipo de concesión de client credentials , debe configurar el controlador de permisos Rest Framework para ver los tokens, ya que client credentials no configuran al usuario en el token generado. Django OAuth Toolkit proporciona permisos personalizados para este propósito:

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

O si su API completa está sujeta al mismo tipo de permisos, simplemente puede configurar el controlador de permisos globalmente en su archivo settings.py , por ejemplo:

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

Por supuesto, esto supone que usted otorga permisos de read write en ese momento.

Más información sobre los ámbitos aquí:

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


He probado la demo que mencionaste y todo estuvo 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/ []

En su caso, creo que creó la aplicación con el "Tipo de concesión de autorización" incorrecto.

Utilice esta configuración de la aplicación:

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

Este https://django-oauth-toolkit.readthedocs.org/en/latest/rest-framework/getting_started.html#step-3-register-an-application me interrumpió mucho.

Aquí está el archivo de la base de datos que he creado: https://www.dropbox.com/s/pxeyphkiy141i1l/db.sqlite3.tar.gz?dl=0

Puedes probarlo tú mismo. Ningún código fuente cambiado en absoluto. Nombre de usuario del administrador de Django - superusuario, contraseña - 123qwe.