APIs e Microsserviços

14 fev, 2014

Série DropboxAPI: Gerando Token no DropBox API – Parte 02

Publicidade

Olá, pessoal!

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

Assumindo que você acompanhou e meteu a mão na massa com o artigo 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 foi 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 artigo 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 artigo.  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.

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

Abraços!