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.