Série Dropbox Gerando Token no DropBox API

Olá Pessoal,

No post de hoje vamos ver como gerar um Token para evitar o problema que tivemos no último post, onde cada vez que a aplicação rodar será preciso autorizar novamente para obter o code.

Lets go…

Starting…

Assumindo que você acompanhou e meteu a mão na massa com o post anterior, vou apenas me limitar aqui a resolver o problema que identificamos de evitar múltiplos allow toda vez que a aplicação sobe e precisa conectar com o dropbox.

Development

Crie uma nova classe no projeto (eu chamei de DropBoxGenerateToken). Esse código não fui eu quem criou. Lembro que encontrei nas minhas inúmeras pesquisas para resolver o problema. Acho que tinham umas 40 abas abertas e achei essa solução na discussão do fórum do dropbox developer. Como o código visto no post anterior, se apenas rodar sem entender não vamos conseguir atingir o objetivo. Veja o código a seguir:

public class DropboxGenerateToken{
    public static void main(String[] args)   throws IOException
    {
        // Only display important log messages.

        Logger.getLogger("").setLevel(Level.WARNING); 

        if (args.length == 0) {

            printHelp(System.out);

            return;

        }
        if (args.length != 2) {

            System.err.println("Expecting exactly 2 arguments, got " + args.length + ".");

            System.err.println("Run with no arguments for help.");

            System.exit(1); return;

        } 

        String argAppInfoFile = args[0];

        String argAuthFileOutput = args[1];

        // Read app info file (contains app key and app secret)

        DbxAppInfo appInfo;

        try {

            appInfo = DbxAppInfo.Reader.readFromFile(argAppInfoFile);

        }

        catch (JsonReader.FileLoadException ex) {

            System.err.println("Error reading <app-info-file>: " + ex.getMessage());

            System.exit(1); return;

        }

        // Run through Dropbox API authorization process

        String userLocale = Locale.getDefault().toString();

        DbxRequestConfig requestConfig = new DbxRequestConfig("examples-authorize", userLocale);

        DbxWebAuthNoRedirect webAuth = new DbxWebAuthNoRedirect(requestConfig, appInfo);

        String authorizeUrl = webAuth.start();

        System.out.println("1. Go to " + authorizeUrl);

        System.out.println("2. Click \"Allow\" (you might have to log in first).");

        System.out.println("3. Copy the authorization code.");

        System.out.print("Enter the authorization code here: ");

        String code = new BufferedReader(new InputStreamReader(System.in)).readLine();

        if (code == null) {

            System.exit(1); return;

        }

        code = code.trim();

        DbxAuthFinish authFinish;

        try {

            authFinish = webAuth.finish(code);

        }

        catch (DbxException ex) {

            System.err.println("Error in DbxWebAuth.start: " + ex.getMessage());

            System.exit(1); return;

        }

        System.out.println("Authorization complete.");

        System.out.println("- User ID: " + authFinish.userId);

        System.out.println("- Access Token: " + authFinish.accessToken);

        // Save auth information to output file.

        DbxAuthInfo authInfo = new DbxAuthInfo(authFinish.accessToken, appInfo.host);

        try {

            DbxAuthInfo.Writer.writeToFile(authInfo, argAuthFileOutput);

            System.out.println("Saved authorization information to \"" + argAuthFileOutput + "\".");

        }

        catch (IOException ex) {

            System.err.println("Error saving to <auth-file-out>: " + ex.getMessage());

            System.err.println("Dumping to stderr instead:");

            DbxAuthInfo.Writer.writeToStream(authInfo, System.out);

            System.exit(1); return;

        }

    }

    private static void printHelp(PrintStream out)

    {

        out.println("Usage: COMMAND <app-info-file> <auth-file-output>");

        out.println("");

        out.println("<app-info-file>: a JSON file with information about your API app.  Example:");

        out.println("");

        out.println("  {");

        out.println("    \"key\": \"Your Dropbox API app key...\",");

        out.println("    \"secret\": \"Your Dropbox API app secret...\"");

        out.println("  }");

        out.println("");

        out.println("  Get an API app key by registering with Dropbox:");

        out.println("    https://dropbox.com/developers/apps");

        out.println("");

        out.println("<auth-file-output>: If authorization is successful, the resulting API");

        out.println("  access token will be saved to this file, which can then be used with");

        out.println("  other example programs, such as the one in \"examples/account-info\".");

        out.println("");

    }

}

 

 Feito isso, crie um arquivo com o nome que quiser do tipo .json (o meu chamei de cam.json) e crie um outro chamado de TOKEN. Poderia ser outro nome.

dropboxapiproject

No arquivo cam.json vamos colocar as Keys do app:

{

"key":"7x7k0667",

"secret":"ccc8p2"

}

 

O arquivo TOKEN ficará vazio, mas após executarmos a aplicação será preenchido com o token que será o code usado sempre que precisarmos conectar ao dropbox.

Se tiver usando o Eclipse IDE vá em Run >> Configuration e execute assim:

dropboxruntokenargs

Aguarde o término e abra o arquivo TOKEN:

{

"access_token" : "V5C0NKXurvIAAAAAAAAAAdgoY"

}

Pronto, temos o Token gerado. Agora podemos usá-lo para autenticar e acessar sempre o nosso dropbox sem precisar dar mais allow, mesmo quando a aplicação for finalizada. Voltando ao projeto anterior, devemos fazer essa alteração no método main:

DbxRequestConfig config = new DbxRequestConfig("JavaTutorial/1.0",       Locale.getDefault().toString());

try {

DbxClient client = new DbxClient(config, "V5C0NKXurvIAAAAAAAAAAdgoY");

System.out.println("Linked account: "

+ client.getAccountInfo().displayName);

DbxEntry.WithChildren listing = client.getMetadataWithChildren("/");

System.out.println("Files in the root path:");

for (DbxEntry child : listing.children) {

System.out.println("       " + child.name + ": " + child.toString());

}

}catch (DbxException e) {

e.printStackTrace();

}

catch (Exception e) {

e.printStackTrace();

}

}

 

Observe quanto de código cortamos comparado com a versão do primeiro post.  Claro que poderíamos ler o arquivo TOKEN e ler apenas a chave para obter o valor.  Execute a aplicação e verá que poderá ver todos os seus arquivos sendo listados.

Muito bom, né? Vou ficando por aqui e espero que tenham gostado de mais um post.

Confiram o projeto no Github da ITS: https://github.com/ITSStartup/dropboxapi-example

Abraços. See ya!!!