Django Tastypie POST no autorizado en diferentes servidores

He configurado OAuth 2.0 como lo describe Ian Alexander usando tastypie, djangooauth2-provider y https://github.com/ianalexander/django-oauth2-tastypie/blob/master/src/authentication.py

Esto funciona espléndidamente en mi servidor local

class AllowGetAuthentication(OAuth20Authentication): def is_authenticated(self, request, **kwargs): """ If GET, don't check auth, otherwise fall back to parent """ if request.method == "GET": return True else: return super(AllowGetAuthentication, self).is_authenticated(request, **kwargs) class BaseModelResource(ModelResource): class Meta: allowed_methods = ['get', 'post'] always_return_data = True authentication = AllowGetAuthentication() authorization = DjangoAuthorization() 

Sin embargo, al ejecutar esto en nuestro servidor de desarrollo alojado, todos los POST vuelven a ser HTTP / 1.1 401 NO AUTORIZADO

He intentado las siguientes pruebas en vano:

(1) reemplazar

 DjangoAuthorization() 

con

 Authorization() 

(2) reemplazar

 return super(AllowGetAuthentication, self).is_authenticated(request, **kwargs) 

con

 return True 

(3) crear una envoltura para todas las URL de la API que está exenta de derechos de autor

Lo único que ha funcionado fue implementar # 1 y # 2 al mismo tiempo (es decir, omitir la autenticación Y la autorización), lo que parece indicar que no es solo un rechazo en el nivel del servidor web.

¡Cualquier pensamiento aquí es apreciado!

Esto sucede porque no has habilitado cors.

 class BaseModelResource(ModelResource): class Meta: queryset = BaseModel.objects.all() resource_name = 'api' authorization = DjangoAuthorization() detail_allowed_methods = ['get', 'post'] always_return_data = True authentication = OAuth20Authentication() 

También en producción o en cualquier servidor: debe agregar corsheaders para acceder desde otros dominios.

Utilice este django-cors-headers

Pasos para utilizar eso:

  1. pip instalar django-cors-headers
  2. agregar ‘corsheaders’ en INSTALLED_APPS
  3. agregue ‘corsheaders.middleware.CorsMiddleware’ en MIDDLEWARE_CLASSES
  4. agregar CORS_ORIGIN_ALLOW_ALL = Verdadero en settings.py

PD: Puede cambiar la configuración más tarde después de leer sobre cors para hacerlo seguro.

Fue un problema de Apache. Agregue esta línea a su archivo conf de sitio.

 WSGIPassAuthorization On 

¿Dónde pongo “WSGIPassAuthorization On”?