Jak uwierzytelnić Dysk Google bez konieczności kopiowania / wklejania kodu auth przez użytkownika?

Bawię się z aplikacją DriveCommandLine, aby nauczyć się trochę interfejsu API napędu. Zastanawiam się tylko, czy możliwe jest uwierzytelnienie mojej aplikacji desktopowej za pomocą Dysku Google bez konieczności kopiowania/wklejania kodu auth z przeglądarki? Ale zamiast tego wystarczy przekazać token z powrotem do aplikacji z przeglądarki? Mogę to zrobić za pomocą interfejsu API Dropbox i interfejsu API listy Dokumentów Google, ale nie mogę dowiedzieć się, jak to zrobić z Dyskiem Google API.

Dzięki.

Google Drive API-drivecommandline przykładowa aplikacja (nieco zmodyfikowana):

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 Documents List API:

    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);
    }
Author: PseudoPsyche, 2012-09-21

3 answers

Próbki wiersza poleceń zostały napisane dla uproszczenia, niekoniecznie najlepszego doświadczenia użytkownika. W tym przypadku działają jako aplikacje lokalne i używają zainstalowanego przepływu aplikacji dla OAuth 2.0. Ten przepływ ma tryb, w którym redirect_uri może wskazywać na localhost, ale wymaga uruchomienia tymczasowego serwera www, aby otrzymać przekierowanie. Zamiast komplikować próbkę, używa trybu OOB, który wymaga skopiowania / wklejenia kodu.

Jeśli budujesz aplikację desktopową, to zachęcaj do przejścia trasy przekierowania do localhost, ponieważ jest to lepszy UX.

Zobacz https://developers.google.com/accounts/docs/OAuth2InstalledApp aby uzyskać więcej informacji.

 6
Author: Steve Bazyl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-21 00:57:05

Krok 1: Wygeneruj adres URL za pomocą typu dostępu offline

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: Przechowuj 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: ponowne użycie tokenów w razie potrzeby

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: zrozumienie OAuth do obsługi błędów i odświeżania tokenów

 6
Author: Vinay Sheshadri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-09 09:03:27

Zmień redirect_uri na stronę localhost lub stronę projektu.Żądanie pod podanym linkiem spowoduje wysłanie Twojego kodu. Żądanie będzie miało kod = "yourauthcode" w swoim adresie url. Przykład: https://yourwebsite.com/yourpage.htm?code="yourauthcode"

 0
Author: Jose Mathew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-20 12:04:56