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);
}
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.
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
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"
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