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.
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 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!!!