Réalisation d’un backend dans le cloud pour application mobile (Part 2)

Update décembre 2016: Découvrez mon livre sur le développement de backend pour application mobile avec Django

Après avoir vu dans la partie 1 comment créer un backoffice et déployer rapidement dans le cloud grâce à un simple commit GIT, nous allons maintenant mettre en place la partie la plus intéressante à savoir l’API qui sera utilisée par nos applications mobile.

La première étape va être de sécuriser notre API avec oAuth2. Commençons donc par ceci.

1. Sécurisation API avec Django oAuth Toolkit

Pour installer oAuth2, rajoutons donc à notre fichier requirements la ligne suivante

django-oauth-toolkit

Puis nous lançons l’installation en local sur notre machine (dans notre environnement virtuel)

pip install django-oauth-toolkit

La ligne du fichier requirements sera utilisé lors du déploiement CleverCloud. Ensuite il faut rajouter à la liste de nos applications dans le fichier settings.py, l’application oauth2_provider ce qui nous donne

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.gis',
    'bo',
    'oauth2_provider',
)

Il faut ensuite configurer l’url pour pouvoir accéder à oAuth2 afin d’obtenir des tokens. Modifions donc le fichier urls.py du répertoire citiesaround comme ceci

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    # Examples:
    url(r'^admin/', include(admin.site.urls)),
    url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),
]

Ok maintenant nous allons pouvoir créer les tables nécessaire au fonctionnement de oAuth2. Vu qu’à la fin de la partie 1, nous avions déployé sur clevercloud, il faut penser à modifier le fichier settings.py pour dire qu’on va utiliser notre fichier dev_settings.py (puisque nous allons lancer la commande des créations SQL depuis notre machine) et non pas le prod_settings.py

"""
Django settings for  project.

"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
#from prod_settings import *
from dev_settings import *

Et lançons maintenant la création avec la commande

python manage.py migrate oauth2_provider

Ok. Et si on allait vérifier dans notre backoffice d’administration que tout est ok. Remodifions le fichier settings.py pour repasser sur prod_settings.py et déployons sur CleverCloud

git commit -am "ajout oAuth2"
git push clever master

Accédons au backoffice d’administration (dans mon cas j’utilise l’url suivante http://app-76b49ba4-9531-497c-a210-b553dd7ec172.cleverapps.io/admin/ qui correspond à mon nom de domaine) et magie on y voit apparaitre les tables spécifiques à oAuth2.

oauth

Tout ce qu’il nous reste à faire et de configurer une application (ça s’appelle comme ça) pour faire fonctionner oAuth2. Vu qu’une application doit être liée à un utilisateur, nous allons d’abord rajouter (via le backoffice) un utilisateur qui servira uniquement à oAuth (et à nos applications mobiles). Pour cela on va dans le menu Utilisateurs du backoffice, puis on clique sur Ajouter un utilisateur

listUser

On ajoute un utilisateur. J’ai décidé de l’appeler oauth et de lui donner comme moi de passe: mobile

addUser

Ensuite il faut rajouter à notre utilisateur les droits sur toutes les tables spécifiques à oAuth.

permUser

Ok maintenant retournons créer notre application oAuth2. Pour cela, il faut donc choisir l’utilisateur que l’on vient de créer, comme client_type indiqué Public et comme Autorisation grant type : Ressource owner password based. Donnez le nom que vous voulez à cette application.

confoAuth2

Nous n’avons plus qu’à tester oAuth2. Pour cela nous allons effectuer une requête (en utilisant curl) afin de réclamer un access_token

curl -X POST -H "Content-Type: application/x-www-form-urlencoded"  -d "grant_type=password&username=oauth&password=mobile" http://eplol4Z3YmX7dDeBWw5RKFpt6XvBYprl1kYUkrMc:CyXFziEy7rlIJlefKBOr4srUL741mezARFVPkWgavXOLFd9lYmZQfjANHp2xfSiMf9VkknYfWN4wlRjQDTzOsaazx2fvqQdmR5H3oRj5IgnRoFl1zkhtEcoTjz9hIVQD@app-76b49ba4-9531-497c-a210-b553dd7ec172.cleverapps.io/o/token/

Et nous obtenons comme réponse un JSON avec notre fameux access_token

{"access_token": "NHf9VHlnTQISFqis4u4T10HceIO2lL", "token_type": "Bearer", "expires_in": 36000, "refresh_token": "HX5k2KwbgQMLvt5GqHL165SqvmX20F", "scope": "read write"}

Lorsque l’on demande un access_token a oAuth2, il faut donc passer comme paramètre le user que l’on a défini, son mot de passe (oauth/mobile dans mon exemple) mais aussi le client_id et client_secret généré lors de la création de l’application oAuth. Pour cela cliquez dans le backoffice afin de voir ses valeurs. Pour résumer

curl -X POST -d "grant_type=password&username=<user_name>&password=<password>" http://<client_id>:<client_secret>@<nom de domaine>/o/token/

Tout ceci peut paraitre bien compliqué, mais c’est assez simple une fois qu’on a pris l’habitude. A noter si l’on souhaite changer la durée de vie de nos access tokens, il faut rajouter les instructions suivantes à notre fichier settings.py

#oAuth2 expiration in five days
OAUTH_ACCESS_TOKEN_MODEL = 'oauth2_provider.models.AccessToken'
OAUTH2_PROVIDER = {
    'ACCESS_TOKEN_EXPIRE_SECONDS' : 86400*5, 
    'SCOPES': {'read': 'Read scope', 'write': 'Write scope', 'groups': 'Access to your groups'}
}

Maintenant que oAuth2 est prêt, il ne nous reste plus qu’à développer notre API et la protéger avec oAuth2. Là aussi ça va être un jeu d’enfant grâce à Django Rest Framework.

Pages: 1 2 3