Repository: zestedesavoir/zds-site

Issue:
Remplacer caffeinehit/django-oauth2-provider
Comme indiqué partout dans les docs, notre fournisseur d'authentification oauth2 sur l'API est caffeinehit/django-oauth2-provider.

Ce projet [n'est pas compatible avec Django 1.7](https://github.com/zestedesavoir/zds-site/pull/2167#issuecomment-71936587). Pire, son [dernier commit date du 18 mars 2014](https://github.com/caffeinehit/django-oauth2-provider/commit/6b5bc0d3ad706d2aaa47fa476f38406cddd01236) et [le domaine principal est mort](http://www.caffeinehit.com), donc [la PR de compatibilité Django 1.7](https://github.com/caffeinehit/django-oauth2-provider/pull/84) ne sera _jamais_ mergée.

On a donc un problème **bloquant** pour le merge de [la PR de passage à Django 1.7](https://github.com/zestedesavoir/zds-site/pull/1905), et heureusement 3 solutions parce que cette bibliothèque est sous licence MIT.
1. On récupère l'un des [172 forks dont au moins 5 ont déjà une branche "compatibilité Django 1.7"](https://github.com/caffeinehit/django-oauth2-provider/network). Si possible celui qui a l'air le plus maintenu et intégré aux outils genre Pip.
2. On fait notre 173ème fork et 6ème branche de compatibilité Django 1.7 - sans espoir que ce soit jamais remonté dans l'upstream puisqu'il est mort.
3. On trouve une autre bibliothèque de gestion d'oauth2.

Qu'en pensez-vous ?



Discussion:

Resolving patch:
diff --git a/zds/settings.py b/zds/settings.py
--- a/zds/settings.py
+++ b/zds/settings.py
@@ -174,8 +174,7 @@
     'social.apps.django_app.default',
     'rest_framework',
     'rest_framework_swagger',
-    'provider',
-    'provider.oauth2',
+    'oauth2_provider',
 
     # Apps DB tables are created in THIS order by default
     # --> Order is CRITICAL to properly handle foreign keys
@@ -218,7 +217,7 @@
     'MAX_PAGINATE_BY': 100,             # Maximum limit allowed when using `?page_size=xxx`.
     # Active OAuth2 authentication.
     'DEFAULT_AUTHENTICATION_CLASSES': (
-        'rest_framework.authentication.OAuth2Authentication',
+        'oauth2_provider.ext.rest_framework.OAuth2Authentication',
     ),
     'DEFAULT_PARSER_CLASSES': (
         'rest_framework.parsers.JSONParser',
diff --git a/zds/urls.py b/zds/urls.py
--- a/zds/urls.py
+++ b/zds/urls.py
@@ -94,7 +94,7 @@ def location(self, article):
 # API
 urlpatterns += patterns('',
                         url(r'^api/', include('rest_framework_swagger.urls')),
-                        url(r'^oauth2/', include('provider.oauth2.urls', namespace='oauth2')),
+                        url(r'^oauth2/', include('oauth2_provider.urls', namespace='oauth2_provider')),
                         url(r'^api/membres/', include('zds.member.api.urls')),
                         )
 


Test patch:
diff --git a/zds/member/api/tests.py b/zds/member/api/tests.py
--- a/zds/member/api/tests.py
+++ b/zds/member/api/tests.py
@@ -5,7 +5,7 @@
 from django.core import mail
 from django.core.urlresolvers import reverse
 from django.test.utils import override_settings
-from provider.oauth2.models import AccessToken, Client
+from oauth2_provider.models import Application, AccessToken
 from rest_framework import status
 from rest_framework.test import APITestCase
 from rest_framework.test import APIClient
@@ -846,16 +846,15 @@ def test_remove_ban_at_a_member_without_permissions(self):
 
 
 def create_oauth2_client(user):
-    client = Client.objects.create(user=user,
-                                   name='zds',
-                                   url='zestedesavoir.com',
-                                   client_type=1)
+    client = Application.objects.create(user=user,
+                                        client_type=Application.CLIENT_CONFIDENTIAL,
+                                        authorization_grant_type=Application.GRANT_PASSWORD)
     client.save()
     return client
 
 
 def authenticate_client(client, clientAuth, username, password):
-    client.post('/oauth2/access_token', {
+    client.post('/oauth2/token/', {
         'client_id': clientAuth.client_id,
         'client_secret': clientAuth.client_secret,
         'username': username,