I. Présentation de l'API▲
Orange met à disposition plusieurs API, parmi elles, on retrouve l'API Cloud France. Celle-ci permet aux utilisateurs de votre application d'utiliser leur Cloud Orange et ses 100 Gb de stockage confidentiel et personnel.
Vous pouvez utiliser cette API pour manipuler des fichiers, synchroniser des données, proposer du stockage à vos utilisateurs et accéder à un marché potentiel de plusieurs millions d'utilisateurs du Cloud Orange en France.
I-A. Inscription ▲
Avant tout, il vous faut un compte développeur ; pour le créer c'est par ici.
Vous avez le formulaire d'inscription suivant qui s'affiche :
Après la validation de ce formulaire, il est nécessaire de lire et d'accepter le Contrat Général d'Utilisation (CGU) :
Vous êtes inscrit ! Vous recevrez un mail de confirmation de votre inscription.
I-B. Création et paramétrage de l'application▲
La réception d'un mail pour valider le compte et créer une première application est systématique et quasiment instantanée.
Lors du clic sur le lien de validation, il est nécessaire de renseigner les quelques informations sur l'application qui va utiliser l'API, un nom et une description (en anglais si possible).
Le message de confirmation apparaît :
Application 'Ma Super Application' has been created. Now click ‘Add an API' to subscribe to an API and activate your client ID.
Ce qui peut se traduire en français par :
L'application « Ma Super Application » a été créée. Vous devez désormais cliquer sur « Ajouter une API » pour souscrire à une API et activer votre client ID.
Il faut alors cliquer sur « ADD API », puis sélectionner « Cloud France » dans la longue liste d'API disponibles. C'est le cinquième de la liste.
Ensuite, cliquez sur le bouton « Next » ; lisez et acceptez le Contrat Général d'Utilisation. Maintenant, cliquez à nouveau sur « Next » pour aller à l'étape suivante.
Attention, l'étape qui vient est très importante ! Il s'agit d'ajouter l'URL de retour de l'API Cloud, c'est-à-dire que l'on va spécifier à Orange l'endroit où l'API va devoir rediriger l'utilisateur après sa connexion au Cloud Orange.
Autrement dit : c'est sur cette URL, complétée par le Authorization_code, que l'utilisateur sera redirigé après sa connexion. On pourra toujours modifier cette URL dans l'onglet Content Screen Details. Pour plus d'informations sur le fonctionnement, vous pouvez lire le tutoriel sur l'authentification 3-Legged.
On obtient alors le message de confirmation ci-dessous :
API 'Cloud France' has been added to application 'Ma Super Application'.
Ce qui peut se traduire en français par :
L'API « Cloud France » a été ajoutée à l'application « Ma Super Application ».
La demande est automatiquement approuvée et on obtient :
- un Application ID ;
- un Client ID ;
- un Client Secret ;
- un Authorization header.
Pour ceux qui l'ont remarqué, l'Authorization header est encodé en base64. Il est à utiliser brut, comme fourni, il s'agit d'une simple chaîne de caractères si vous vous amusez à la décoder.
Pour voir le Client ID et le Client secret, il est nécessaire de cliquer sur le bouton « Show » puis d'entrer son mot de passe. Après quoi, les deux informations apparaissent.
Et les détails s'affichent :
II. Programmation avec l'API Cloud Orange▲
Maintenant, vous disposez de tout ce qui est nécessaire pour pouvoir réaliser vos appels à l'API. Il ne vous reste qu'à utiliser les SDK mis à disposition. Libre à vous d'utiliser votre propre langage, l'API étant une API REST, vous pouvez utiliser PHP avec cURL ou bien d'autres langages.
Des SDK ont été mis à disposition pour d'autres langages :
La liste des SDK disponibles et à jour est disponible ici.
II-A. Programmer pour une application en langage Python▲
II-A-1. Pour démarrer▲
Pour Python, il est nécessaire de posséder … Python ! Pour télécharger l'installeur, c'est par ici.
Nous utiliserons la version 3.5 de Python pour cet exemple. Cependant, vous pouvez décider de prendre la version 2.7 pour l'intégrer à votre projet, cela n'a pas d'importance.
Une fois l'installation de Python terminée, on démarre « Python » et « IDLE », il s'agit de l'interpréteur Python et de la console Python. C'est dans cette dernière que nous allons coder notre application.
La première étape va être de s'assurer du consentement de l'utilisateur dont on veut avoir accès à son compte Cloud.
Cela se fait avec la requête passer à l'URL suivant :
https://api.orange.com/oauth/v2/authorize?prompt=login%20consent&state=orangeCloud&redirect_uri=[REDIRECT_URI]&response_type=code&client_id=[CLIENT_ID]&scope=openid%20Cloud
Pensez à utiliser la bibliothèque urllib avec :
2.
3.
import
urllib
f =
{ 'redirect_uri'
: 'http://www.masuperapplication.com/'
}
urllib.urlencode
(
f)
En effet, cette dernière vous facilitera la tâche. Les espaces doivent être remplacés par des %20, les slash par des %2F.
Notre utilisateur arrivera donc sur la page de connexion Orange Cloud puis, une fois authentifié, il sera redirigé sur la page spécifiée dans votre redirect_uri :
http://www.masuperapplication.com/?code=OFR-3987d7…d5r47eff&state=state
Il ne vous reste plus qu'à récupérer ce code lors de la redirection. Vous devrez passer le code au constructeur de la classe OrangeCloudClient. Lors de l'instanciation, la classe se chargera seule de l'entière gestion des tokens d'authentification. Vous n'aurez pas à gérer cette partie.
Attention, avant de donner son consentement, l'utilisateur doit avoir accepté le contrat général d'utilisation du Cloud Orange. S'il ne l'a pas encore accepté, la demande retournera une erreur CGU_NOT_ACCEPTED. Toutefois, une page pour accepter le contrat est présentée automatiquement à l'utilisateur lors de sa connexion.
II-A-2. Instanciation de OrangeCloudClient▲
Avant toute chose, il faut commencer par importer les bonnes bibliothèques. Pour cela, il suffit de rentrer la ligne ci-dessous :
from
pyorangeCloud import
OrangeCloudClient
Ensuite, l'instanciation est simple, elle se fait comme suit :
app =
{'clientId'
:'CLIENT_ID'
,'clientSecret'
:'CLIENT_SECRET'
,'redirectUri'
:'REDIRECT_URI'
} client =
OrangeCloudClient
(
app,authCode=
'CODE_RECUPERE_LORS_RECUPERATION_DEMANDE_CONSENTEMENT'
)
II-A-3. Lister le contenu d'un dossier▲
Pour lister le contenu d'un dossier, le code est le suivant :
2.
3.
folderInfo =
client.listFolder
(
)
for
f in
folderInfo['subfolders'
]+
folderInfo['files'
]:
print
(
f['name'
] +
' '
+
f.get
(
'type'
,''
))
Ce code permet d'avoir la liste des fichiers et dossiers à la racine du Cloud.
Pour lister le contenu d'un dossier spécifique, il est nécessaire de passer un identifiant de dossier à la méthode « listFolder(FILE_ID) ».
Aussi, si vous souhaitez récupérer récursivement le contenu de dossier et des sous-dossiers, vous utiliserez la méthode « listAllFiles() » en lieu et place de « listFolder() ».
II-A-4. Récupérer les informations d'un fichier ou d'un dossier▲
Dans l'exemple précédent, nous avons vu comment récupérer le contenu du dossier racine. Cependant, pour passer un FILE_ID à notre méthode, il est nécessaire de pouvoir récupérer ce FILE_ID. Pour cela, voici comment faire :
2.
3.
4.
5.
6.
7.
folderInfo =
client.listFolder
(
)
for
d in
folderInfo['subfolders'
]:
print
(
d['name'
])
files =
folderInfo['files'
]
for
f in
files:
details =
client.getFileInfo
(
f['id'
])
print
(
"
%(name)s
: type:
%(type)s
size:
%(size)s
date:
%(creationDate)s
"
%
details)
Vous avez maintenant toutes les informations pour lister le contenu du Cloud Orange. Nous allons maintenant voir comment télécharger du contenu.
II-A-5. Télécharger du contenu▲
Pour télécharger du contenu, c'est extrêmement simple. Il suffit de donner un identifiant de fichier à cette fonction et un répertoire de téléchargement. Cette simple ligne se charge de tout !
client.downloadFile
(
fileId,"/my/target/directory-or-file"
)
II-A-6. Envoyer du contenu▲
Pour envoyer du contenu, l'opération est simple aussi, il s'agit de la fonction suivante :
fileId =
client.uploadFile
(
"mypicture.jpg"
,folderInfo['id'
],"@/my/file/location/mypicture.jpg"
)
Cette dernière prend trois arguments en paramètre :
- le premier est le nom du fichier qui va être envoyé ;
- le second est l'identifiant du répertoire dans lequel on upload le fichier ;
- le troisième est le lieu de stockage local du fichier (le path du fichier à envoyer).
II-A-7. Supprimer un fichier ou répertoire▲
Ces deux fonctions prennent en argument l'identifiant du répertoire à supprimer.
2.
3.
4.
5.
#Pour un fichier
client.deleteFile
(
fileId)
#Pour un dossier
client.deleteFolder
(
folderId)
II-A-8. Créer un répertoire▲
Pour créer un répertoire sur le Cloud Orange, il est nécessaire de passer en paramètre à la fonction suivante le nom du répertoire à créer ainsi que l'identifiant du dossier parent (dans l'arborescence du Cloud).
folderInfo =
client.createFolder
(
"myfoldername"
,myFolderId)
Voici un résumé des fonctions disponibles dans le SDK officiel en Python ; cependant, libre à vous d'utiliser votre propre langage. L'API étant une API REST, vous pouvez utiliser n'importe quel langage que vous maîtrisez, ou même directement cURL.
II-B. Programmer pour une application Java sous Android▲
II-B-1. Pour démarrer▲
Il est nécessaire de télécharger et d'installer Android Studio téléchargeable sur ce lien.
L'installation d'Android Studio requiert Java :
Après installation, on démarre Android Studio, puis on clique sur « Import project (Eclipse ADT, Gradle, etc.) ».
Le menu au démarrage d'Android Studio se présente comme suit :
Nous sélectionnons alors le chemin (path) du dossier exemple (sample) (OrangeCloudAndroidSdk-master/sample), puis on clique sur OK, comme indiqué ci-dessous :
À ce stade, il est important de remplacer le APP_KEY, le APP_SECRET et le APP_REDIRECT_URI par les clés d'API données dans votre espace client Orange dans le fichier MainActivity.java :
2.
3.
final
static
private
String APP_KEY =
"votre api key"
;
final
static
private
String APP_SECRET =
"votre app secret"
;
final
static
private
String APP_REDIRECT_URI =
"votre url de redirection"
;
II-B-2. Prérequis pour le bon fonctionnement du script▲
Maintenant, nous allons vérifier les deux conditions qui font que cela va fonctionner.
II-B-2-a. Vérifier le AndroidManifest.xml ▲
Pour que l'utilisateur puisse s'authentifier auprès d'Orange, il est nécessaire d'ajouter ce petit bloc de code en dessous de la balise <application>, donc juste après le </application>.
2.
3.
4.
<
activity
android:name=
"com.orange.labs.sdk.activity.AuthActivity"
android:launchMode=
"singleTask"
android:configChanges=
"orientation|keyboard"
/>
La balise est auto-fermante, pas besoin de </activity>.
Vous pouvez lire notre tutoriel, pour en savoir plus sur comment accéder aux données ou contenus personnels d'un utilisateur via l'« authentification 3-legged ».
On peut également vérifier que notre application Android a bien le droit d'utiliser le réseau Internet, toujours dans le AndroidManifest.xml. Pour attribuer le droit, voici la ligne de code à rajouter (en dessous de la section <manifest>, donc après la balise </manifest>.
<
uses
-
permission android:name=
"android.permission.INTERNET"
></
uses
-
permission>
II-B-2-b. Vérifier le Activity.java▲
Dans le fichier Activity.java, on rajoute les constantes d'API Orange (fournies à l'étape de l'inscription).
2.
3.
final
static
private
String APP_KEY =
"votre api key"
;
final
static
private
String APP_SECRET =
"votre app secret"
;
final
static
private
String APP_REDIRECT_URI =
"votre url de redirection"
;
II-B-3. L'utilisation de l'API▲
Attention, dans cette partie nous allons traiter de l'authentification de l'API (comprendre que votre application se connecte aux serveurs Orange) et de l'authentification de l'utilisateur (qui doit lui aussi s'authentifier pour que notre application puisse utiliser son espace de stockage Cloud). Il est important de ne pas les confondre, aussi, l'utilisateur doit posséder un espace sur le Cloud Orange. S'il n'en a pas, c'est par ici.
Rien d'étonnant, avant d'utiliser l'API, il est nécessaire d'authentifier l'application auprès d'Orange, et cela se fait simplement :
2.
3.
4.
5.
6.
// Dans la déclaration de classe
public
OrangeCloudAPI<
AuthSession>
mApi;
// On instancie un objet de type AuthSession que l'on appelle session. La magie du SDK s'occupe du reste.
AuthSession session =
new
AuthSession
(
Activity.this
, APP_KEY, APP_SECRET, APP_REDIRECT_URI);
mApi =
new
OrangeCloudAPI<
AuthSession>(
session);
Comme dans toute API, il est nécessaire de définir un « scope » pour notre accès, dans le fichier AndroidManifest.xml. Un « scope » est un paramètre qui permet de définir la portée des droits de la demande d'autorisation. Les différents scopes sont définis dans le Getting Started de l'API Cloud d'Orange.
On définit le scope avec cette ligne de code :
mApi.addScope
(
"Cloud"
);
Le « scope » dépend de l'utilisation que votre application va avoir avec le Cloud d'Orange.
Il est possible d'utiliser de multiples « scope ». Il suffit de les écrire les uns à la suite des autres avec des espaces. Par exemple :
mApi.addScope
(
"Cloud Cloudfullread"
) ;
Le « scope » Cloudfullwrite est soumis à autorisation. Par défaut, « Ma Super Application » ne peut pas écrire dans l'ensemble du Cloud Orange. Pour obtenir cette autorisation, il est nécessaire de faire la demande ici.
Maintenant, il est nécessaire d'authentifier l'utilisateur auprès d'Orange. Pour cela, s'il s'agit de la première connexion de l'utilisateur, la méthode ouvre une AuthActivity (déclarée dans le AndroidManifest.xml). Cette étape permet d'authentifier l'utilisateur ainsi que d'autoriser l'accès aux services Cloud d'Orange.
mApi.getSession
(
).startAuthentication
(
);
Lors de l'authentification, l'utilisateur est renvoyé vers votre Activity.java. À ce moment, pour finir l'authentification de l'utilisateur, vous devez compléter votre méthode onResume avec le code suivant :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Override
protected
void
onResume
(
) {
super
.onResume
(
);
// Récupère la session et regarde ou en est le processus d'authentification
final
AuthSession session =
mApi.getSession
(
);
session.checkAuthentication
(
new
OrangeListener.Success<
String>(
) {
@Override
public
void
onResponse
(
String response) {
// La session est valide, vous pouvez utiliser les fonctions du Cloud Orange.
}
}
, new
OrangeListener.Error
(
) {
@Override
public
void
onErrorResponse
(
OrangeAPIException error) {
// Il y a eu une erreur lors du processus
}
}
);
}
II-B-4. Quelques exemples de codes ▲
II-B-4-a. Lister le contenu du Cloud Orange▲
Pour lister le contenu d'un répertoire, vous devez passer un objet Entry. Si vous souhaitez récupérer la racine, passez un null.
Attention, dans le code suivant, le paramètre est un JSONObject et doit systématiquement contenir au minimum Authorization (le jeton d'autorisation) et folderId (le chemin du répertoire à récupérer).
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
mApi.listEntries
(
anEntry, parameters, new
OrangeListener.Success<
OrangeCloudAPI.Entry>(
) {
Override
public
void
onResponse
(
OrangeCloudAPI.Entry response) {
// success
}
}
, new
OrangeListener.Error
(
) {
@Override
public
void
onErrorResponse
(
OrangeAPIException error) {
// Error occurred
}
}
);
On peut décider de passer d'autres paramètres pour récupérer les thumbnails
showthumbnails. Si les paramètres sont présents, la réponse de l'API contiendra systématiquement la miniature, la preview ou une URL de téléchargement pour chaque fichier.
Il est aussi possible de souhaiter récupérer uniquement les photos ou les vidéos. Cela est possible avec le paramètre filter : il peut contenir les valeurs suivantes : [image|video|audio|other].
La réponse de l'API sera sous la forme suivante pour chaque fichier :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
file_def {
id (
string, optional),
name (
string, optional),
size (
integer, optional),
creationDate (
date-
time, optional),
lastUpdateDate (
date-
time, optional),
type (
string, optional) =
["FILE"
or "PICTURE"
or "VIDEO"
or "AUDIO"
],
downloadUrl (
string, optional),
previewUrl (
string, optional),
thumbUrl (
string, optional),
metaData (
object, optional)
}
II-B-4-b. Envoyer un fichier vers le Cloud d'Orange▲
Il est important de noter que cette tâche pouvant être longue, elle doit être appelée en tâche de fond, cela pour ne pas faire patienter l'utilisateur durant le processus. Il doit s'agir d'un background ou d'un IntentService.
Pour savoir comment créer un IntentService, voici le lien.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
mApi.upload
(
fileUri, filename, entryToUpload, new
OrangeListener.Success<
JSONObject>(
) {
@Override
public
void
onResponse
(
JSONObject response) {
// Le fichier est envoyé
}
}
, new
OrangeListener.Progress
(
) {
@Override
public
void
onProgress
(
float
ratio) {
// Progress bar (ratio = [0,1])
}
}
, new
OrangeListener.Error
(
) {
@Override
public
void
onErrorResponse
(
OrangeAPIException error) {
// Une erreur a été levée
}
}
);
II-C. Programmer pour une application sous iOS (Swift)▲
II-C-1. Pour démarrer▲
En rappel, vous devez avant tout développement posséder un Client ID et un Client Token pour pouvoir appeler l'API.
Pour programmer en Swift, vous devez disposer de Xcode et d'un Mac en mode développeur. Pour cela rien de plus simple, rendez-vous dans l'App Store de votre Mac puis cherchez « Xcode ».
L'installation est simplifiée et vous n'avez rien à faire pour que cela fonctionne.
À présent, rendez-vous sur le lien de téléchargement du SDK Swift de l'API Cloud Orange.
Pour ceux qui utilisent Git, vous pouvez cloner le repo git. Pour cela, ouvrez votre terminal, et lancez successivement les commandes :
git init
git clone https://github.com/Orange-OpenSource/OrangeCloudIOSSdk.git
Pour les autres, vous pouvez cliquer sur « Download in Zip » comme présenté dans la figure ci-dessous.
Vous vous retrouvez donc avec un répertoire zip à décompresser. Après la décompression, lancez le fichier « OrangeCloudSDK.xcodeproj ».
Vous êtes à présent dans Xcode. Avec le projet lancé, vous avez l'arborescence suivante :
À ce stade, il est important de remplacer le APP_KEY, le APP_SECRET et le APP_REDIRECT_URI par les clés d'API données dans votre espace client Orange dans le fichier BrowseController.m.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
(
void
)
viewDidLoad
{
[
super
viewDidLoad
];
self
.
view
.
backgroundColor
=
[
UIColor
whiteColor
];
// Créez un objet connexion qui fera la première authentification utilisateur et une session avec l'API Cloud Orange
self
.
CloudManager
=
[[
CloudManager alloc
]
initWithAppKey
:
@
"APP_KEY"
appSecret
:
@
"APP_SECRET"
redirectURI
:
@
"APP_REDIRECT_URI"
];
[
self
.
CloudManager setUseWebView
:
TRUE
];
[
self
.
CloudManager setForceLogin
:
TRUE
];
}
À présent, vous n'avez plus qu'à compiler et démarrer votre simulateur iOS pour obtenir un projet fonctionnel.
Bien que le SDK ait été écrit en Objective-C, ce dernier a été conçu de manière à maximiser la compatibilité avec Swift. Ainsi, si vous souhaitez utiliser le SDK dans un projet Swift, vous n'avez qu'à ajouter la ligne suivante dans le bridging header de votre application :
#
import
"CloudManager.h"
Généralement, ce fichier est appelé MA-SUPER-APPLICATION-Bridging-Header.h.
L'authentification est automatiquement gérée par le SDK. Aussi, vous n'avez pas à gérer cette partie dans votre code.
La gestion du « scope » est automatique en fonction des usages de votre application. Aussi, cette partie n'a pas à être gérée dans votre code.
II-C-2. La classe CloudManager▲
Il s'agit de la classe principale du SDK, cette dernière vous autorise l'accès à l'intégralité des fonctionnalités du Cloud (Authentification utilisateur, liste des fichiers, informations de fichiers…).
Lors du développement de votre application, vous n'avez qu'à instancier un objet CloudManager avec votre CLIENT_ID et votre CLIENT_TOKEN dans la vue principale. Ensuite, lorsque l'utilisateur a donné son consentement, vous pourrez accéder à ses fichiers.
II-C-3. Quelques exemples de codes▲
II-C-3-a. Lister le contenu du Cloud Orange▲
Pour lister le contenu d'un répertoire, voici le code adéquat :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
func
listFolder
(
context
:
TestContext
,
result
:
(
TestState
)->
Void
)
{
if
let
folder
=
context
.
testFolder
{
context
.
manager
.
listFolder
(
folder
,
restrictedMode
:
false
,
showThumbnails
:
true
,
filter
:
.
All
,
flat
:
false
,
tree
:
false
,
limit
:
0
,
offset
:
0
)
{
items
,
status
in
if
let
items
=
items
as
?
[
CloudItem
]
where
items
.
count
>
0
{
context
.
testFile
=
items
[
0
]
}
result
(
status
==
StatusOK
?
.
Succeeded
:
.
Failed
)
}
}
else
{
result
(.
Failed
)
}
}
La réponse de l'API sera sous la forme suivante pour chaque fichier :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
file_def
{
id
(
string
,
optional
),
name
(
string
,
optional
),
size
(
integer
,
optional
),
creationDate
(
date
-
time
,
optional
),
lastUpdateDate
(
date
-
time
,
optional
),
type
(
string
,
optional
)
=
[
"FILE"
or
"PICTURE"
or
"VIDEO"
or
"AUDIO"
],
downloadUrl
(
string
,
optional
),
previewUrl
(
string
,
optional
),
thumbUrl
(
string
,
optional
),
metaData
(
object
,
optional
)
}
II-C-4. Envoyer un fichier vers le Cloud d'Orange▲
Il est important de noter que cette tâche pouvant être longue, elle doit être appelée en tâche de fond, cela pour ne pas faire patienter l'utilisateur durant le processus.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
func
uploadFile
(
context
:
TestContext
,
result
:
(
TestState
)->
Void
)
{
let
bundle
=
NSBundle
.
mainBundle
()
if
let
folder
=
context
.
testFolder
,
path
=
bundle
.
pathForResource
(
"image"
,
ofType
:
"jpg"
),
data
=
NSData
(
contentsOfFile
:
path
)
{
context
.
manager
.
uploadData
(
data
,
filename
:
"image.jpg"
,
folderID
:
folder
.
identifier
,
progress
:
nil
)
{
item
,
status
in
//) { CloudItem, status in
if
status
==
StatusOK
{
context
.
testFile
=
item
result
(.
Succeeded
)
}
else
{
result
(.
Failed
)
}
}
}
else
{
result
(.
Failed
)
}
}
Remerciements▲
Nous remercions Philippe Granger pour la rédaction de ce tutoriel, Guillaume Sigui pour la relecture technique et la mise au gabarit, et Malick Seck pour sa relecture orthographique.