Développer une App Dropbox en Java

Aujourd’hui nous allons prototyper une application Dropbox capable d’envoyer des fichier entre un client et un server sans utiliser le protocole FTP.

Nous regarderons plus en détail la librarie JCommander et le processus d’authentification afin d’uploader et downloader des fichiers depuis Dropbox.

Lecture recommandée

Dropbox App: dir2server

Dans ce tutorial nous allons créé le projet “dir2server”. Un petit software capable d’envoyer des fichier depuis votre ordinateur (client) dans votre Dropbox. Puis depuis un autre ordinateur (votre server) le télécharger. utile pour échanger des données entre client et serveur sans FTP.


Authentification Dropbox en Java

Avant d’être capable d’écrire dans un dossier Dropbox vous devez vous identifié comme propriétaire de celle-ci.
Pour raison de sécurité Dropbox ne nous autorise pas à utiliser directement votre login/password. Vous devez vous authentifié à un application qui elle même sera capable de lire/écrire dans votre dossier.

Vous avez besoin de 4 clés pour vous authentifier:
AppKey & AppSecret – Fourni lorsque vous crée une App
AccessKey & AccessSecret – Lorsque l’application est autorisée

Crée la Dropbox App

  • Inutil de suivre ces étapes si vous désirez simplement utiliser dir2server car l’App à déjà été créé. Pour votre information le propriétaire de l’app ne peux rien faire sans votre AccessKey & AccessSecret
  • Les application Dropbox sont “vérouiller” à leurs dossiés. Elle ne peuvent ni lire ni écrire des fichiés en dehors de leurs dossier.
    Dans notre cas dir2server est vérouillé dans sont dossier /Dropbox/Apps/dir2server/

Créé un application sur dropbox.com afin d’obtenir votre AppKey & AppSecretcreateDropBoxApp

Après avoir cliquer “create” votre AppKey & AppSecret vous sera fourni. Dans mon cas:
App key: o40z96h1ey82hoq
App secret: b6l1nbuk98xf5y2

Authentication à l’App Dropbox en Java

Regardez le code source de dir2server afin de voir le processus d’authentification.

public AccessTokenPair request() throws DropboxException, MalformedURLException, IOException, URISyntaxException {
    AppKeyPair appKeys = new AppKeyPair("YOUR_AppKey", "YOUR_AppSecret");
    //AppKeyPair appKeys = new AppKeyPair("o40z96h1ey82hoq", "b6l1nbuk98xf5y2");
    WebAuthSession session = new WebAuthSession(appKeys, AccessType.APP_FOLDER);
    WebAuthInfo authInfo = session.getAuthInfo();

    RequestTokenPair pair = authInfo.requestTokenPair;
    String url = authInfo.url;

    //wait for user to process authentification on HTTPS
    System.out.println("Accept the app by openning your browser at this URL:");
    System.out.println(url);
    System.out.println("THEN press any key:");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	br.readLine();

    try {
    	session.retrieveWebAccessToken(pair);
    } catch (Exception e) {
    	System.out.println("authentication fail with exception:" + e);
    }

    AccessTokenPair tokens = session.getAccessTokenPair();
    return tokens;
}

Comme vous pouvez le voir la class WebAuthSession écrite par l’équipe de Dropbox s’occupe de tous.
Elle renvoi une URL HTTPS que vous devez ouvrir dans un navigateur afin de fournir les droits à l’application.
Dans mon cas https://www.dropbox.com:443/1/oauth/authorize?oauth_token=RDrnZQsxx7povwhiB

Seulement lorsque l’application à été authorisée revenez dans votre console et tappez n’importe quel tous pour finir l’authentification.
Dans mon cas j’ai reçu:
AccessKey q6ef0nl0hh_XXXXX_
AccessSecret rj9sopth_XXXXX_

Uploader un fichier dans Dropbox en Java

Avec ces 4 clés vous pouvez construire un objet DropboxAPI capable d’interagir avec dropbox.

AppKeyPair appKeys = new AppKeyPair("YOUR_AppKey", "YOUR_AppSecret");
//AppKeyPair appKeys = new AppKeyPair("o40z96h1ey82hoq", "b6l1nbuk98xf5y2");
AccessTokenPair sourceAccess = new AccessTokenPair("YOUR_AccessKey","YOUR_AccessSecret");

WebAuthSession session = new WebAuthSession(pair,Session.AccessType.APP_FOLDER, sourceAccess);
DropboxAPI<WebAuthSession> sourceClient = new DropboxAPI<WebAuthSession>(session);

File file = new File("myFile.txt");
sourceClient.putFile("myFile.txt", new FileInputStream(file), file.length(), null, null);

L’API de Dropbox s’occupe de tous. Vous avez seulement à reconstruire une session authentifié depuis vos clés puis appeler “putFile()” pour commencer l’upload.

Télécharger depuis Dropbox en Java

AppKeyPair appKeys = new AppKeyPair("YOUR_AppKey", "YOUR_AppSecret");
//AppKeyPair appKeys = new AppKeyPair("o40z96h1ey82hoq", "b6l1nbuk98xf5y2");
AccessTokenPair sourceAccess = new AccessTokenPair("YOUR_AccessKey","YOUR_AccessSecret");

WebAuthSession session = new WebAuthSession(pair,Session.AccessType.APP_FOLDER, sourceAccess);
DropboxAPI<WebAuthSession> sourceClient = new DropboxAPI<WebAuthSession>(session);

sourceClient.getFile("myFile.txt", null, new FileOutputStream( "myFile.txt"), null);

Même idée pour uploader un fichier, la fonction “getFile()” implémente toute la logique de téléchargement.

Controller dir2server depuis la ligne de command – CLI

Regardez le point d’entre de notre prototype:

public static void main(String[] args){
		Main main = new Main();

		Client2ServerCmd cmd = new Client2ServerCmd();
		new JCommander(cmd, args);

		main.mightSaveTokenCmd(cmd);
		main.mightUploadCmd(cmd);
		main.mightDownloadCmd(cmd);
}

Notre objet Client2ServerCmd est rempli les paramètres de la ligne de commandes correspondant grâce à la librairie JCommander

public class Client2ServerCmd {
	/* download */
	@Parameter(names = "--download", description = "File to download")
	private String downloadFile;

	[...]
}

main.mightUploadCmd(cmd) vérifie si la commande est valide. Puis si c’est le cas, l’upload sera appeler.
Lorsque vous crée un java jar exécutable vous pouvez envoyer les commandes depuis votre console.

java -jar dir2server.jar --upload myFile.txt

dir2server encore plus loin!

Avec dir2server vous pouvez télécharger un fichier avant qu’il est fini de s’uploader. Mais aussi avant même que l’upload est commencer!
Vous pouvez aussi envoyer un email de notification lorsque le téléchargement ce fini.

Laisser un commentaire