Série DropboxAPI: Gerando Token no DropBox API – Parte 02
No artigo de hoje vamos ver como gerar um Token para evitar o problema que tivemos no último artigo.
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.
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:
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!









