2012-09-20 5 views
9

Używam aplikacji DriveCommandLine, aby nauczyć się trochę interfejsu Drive API. Zastanawiam się tylko, czy możliwe jest uwierzytelnienie mojej aplikacji komputerowej na Dysku Google bez konieczności kopiowania/wklejania kodu autorskiego z przeglądarki? Ale czy po prostu przekazano token z aplikacji do przeglądarki? Mogę to zrobić za pomocą interfejsu API Dropbox i interfejsu API listy dokumentów Google, ale nie mogę się dowiedzieć, jak to działa, używając interfejsu API Dysku Google.Jak uwierzytelnić Dysk Google, nie wymagając od użytkownika kopiowania/wklejania kodu autorskiego?

Dzięki.

Dysk Google API - aplikacja próbka DriveCommandLine (nieco zmodyfikowane):

public class DriveCommandLine { 

    private static String CLIENT_ID = APPCONSTANTS.Google.CONSUMER_KEY; 
    private static String CLIENT_SECRET = APPCONSTANTS.Google.CONSUMER_SECRET; 

    private static String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob"; 

    public static void main(String[] args) throws IOException, URISyntaxException { 
    HttpTransport httpTransport = new NetHttpTransport(); 
    JsonFactory jsonFactory = new JacksonFactory(); 

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
     httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE)) 
     .setAccessType("offline") 
     .setApprovalPrompt("force").build(); 

    String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build(); 
    System.out.println("Enter authorization code:"); 
    Desktop.getDesktop().browse(new URI(url)); 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String code = br.readLine(); 

    GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute(); 
    GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response); 

    //Create a new authorized API client 
    Drive service = new Drive.Builder(httpTransport, jsonFactory, credential).build(); 
} 

Google API Lista Dokumenty:

public void authenticate(){ 
      GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); 
      oauthParameters.setOAuthConsumerKey(APPCONSTANTS.Google.CONSUMER_KEY); 

      OAuthSigner signer; 
      if (APPCONSTANTS.Google.USE_RSA_SIGNING) { 
        signer = new OAuthRsaSha1Signer(APPCONSTANTS.Google.CONSUMER_SECRET); 
      } else { 
       oauthParameters.setOAuthConsumerSecret(APPCONSTANTS.Google.CONSUMER_SECRET); 
       signer = new OAuthHmacSha1Signer(); 
      } 

      GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(signer); 

      oauthParameters.setScope(APPCONSTANTS.Google.SCOPES); 

      oauthHelper.getUnauthorizedRequestToken(oauthParameters); 

      String requestUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); 

      Desktop desktop = Desktop.getDesktop(); 
      URI url = new URI(requestUrl); 
      desktop.browse(url); 

      String token = oauthHelper.getAccessToken(oauthParameters); 
    } 
+0

Jakich wartości 'redirect_uri' używasz dla każdej z tych opcji? Czy korzystasz z tych samych przepływów? –

+0

Dodałem kod do uwierzytelniania za pomocą interfejsu API listy dokumentów Google do OP. – PseudoPsyche

Odpowiedz

6

Komenda próbki linii zostały napisane dla uproszczenia, niekoniecznie najlepsze doświadczenie użytkownika . W tym przypadku działają one jako aplikacje lokalne i używają zainstalowanego przepływu aplikacji dla OAuth 2.0. Ten przepływ ma tryb, w którym element redirect_uri może wskazywać na localhost, ale wymaga uruchomienia tymczasowego serwera WWW w celu otrzymania przekierowania. Zamiast komplikować próbkę, używa trybu OOB, który wymaga skopiowania/wklejenia kodu.

Jeśli tworzysz aplikację komputerową, zachęcam do przejścia na przekierowanie do localhost, ponieważ jest to lepszy UX.

Aby uzyskać więcej informacji, patrz https://developers.google.com/accounts/docs/OAuth2InstalledApp.

+0

Dzięki! Właśnie tego szukałem! – PseudoPsyche

+0

OK, ale w jaki sposób mogę uzyskać nowy token dostępu za pomocą zapisanego tokena odświeżania bez wywoływania nowej autoryzacji? Nie jest określony w java .. – Aerox

0

Zmień swój redirect_uri na swoją stronę localhost lub stronę projektu. Żądanie pod podanym linkiem zostanie wysłane z twojego kodu. Żądanie będzie zawierać kod = "yourauthcode" w adresie URL. Przykład: https://yourwebsite.com/yourpage.htm?code= "yourauthcode"

6

Krok 1: Generowanie adresu URL za pomocą nieaktywny typ dostępu

flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE)) 
.setAccessType("offline") 
.setApprovalPrompt("auto").build(); 
String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build(); 

Krok 2: przechowywać poświadczenia accessToken i refreshToken

GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute(); 
      GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport) 
       .setJsonFactory(jsonFactory) 
       .setClientSecrets(CLIENT_ID, CLIENT_SECRET) 
       .build() 
       .setFromTokenResponse(response); 
String accessToken = credential.getAccessToken(); 
String refreshToken = credential.getRefreshToken(); 

Krok 3: tokeny Reuse, gdy potrzebne

GoogleCredential credential1 = new GoogleCredential.Builder().setJsonFactory(jsonFactory) 
.setTransport(httpTransport).setClientSecrets(CLIENT_ID, CLIENT_SECRET).build(); 
credential1.setAccessToken(accessToken); 
credential1.setRefreshToken(refreshToken); 
Drive service = new Drive.Builder(httpTransport, jsonFactory, credential1).build(); 

Krok 4: poniżej stand OAuth do obsługi błędów i odświeżania tokenów

+1

Skąd czerpimy 'code' (jak w' flow.newTokenRequest (code) 'w kroku 2?) – michaelsnowden