by Guest » 17 Jan 2025, 02:53
Ich bin bereit, meiner (nativen) Android-App eine Art Google Drive-Synchronisierung hinzuzufügen – ohne Backend (alles geschieht in der App).
Wie in der zu sehen In der Google Identity-Dokumentation verwende ich einen AuthorizationClient, um über das AuthenticationResult ein Zugriffstoken zu erhalten:
Code: Select all
List requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build();
Identity.getAuthorizationClient(this)
.authorize(authorizationRequest)
.addOnSuccessListener(
authorizationResult -> {
if (authorizationResult.hasResolution()) {
// Access needs to be granted by the user
PendingIntent pendingIntent = authorizationResult.getPendingIntent();
try {
startIntentSenderForResult(pendingIntent.getIntentSender(), REQUEST_AUTHORIZE, null, 0, 0, 0, null);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage());
}
} else {
// Access already granted, continue with user action
saveToDriveAppFolder(authorizationResult);
}
})
.addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
Code: Select all
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == MainActivity.REQUEST_AUTHORIZE) {
AuthorizationResult authorizationResult = Identity.getAuthorizationClient(this).getAuthorizationResultFromIntent(data);
saveToDriveAppFolder(authorizationResult);
}
}
Und dann daraus eine Drive-Instanz erstellen:
Code: Select all
Drive.Builder(
GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance(),
HttpCredentialsAdapter(GoogleCredentials.create(AccessToken(authorizationResult.getAccessToken(), null)))
).build()
So weit, so gut, alles funktioniert gut, aber da AuthorizationResult kein Aktualisierungstoken enthält – wie soll ich mit dem Ablauf des Zugriffstokens umgehen? Die App soll im Hintergrund ohne Benutzerinteraktionen synchronisiert werden, daher werde ich den Autorisierungsfluss nicht erneut starten (es sei denn, er wird natürlich widerrufen).
Mir ist bekannt, dass getServerAuthCode( ) könnte an Ihr Backend gesendet werden, um ein Paar Zugriffs-/Aktualisierungstoken für den serverseitigen Zugriff anzufordern, aber ich muss (oder möchte) nicht serverseitig auf die Daten meines Benutzers zugreifen.Vermisse ich? etwas?
Ich bin bereit, meiner (nativen) Android-App eine Art Google Drive-Synchronisierung hinzuzufügen – ohne Backend (alles geschieht in der App).
Wie in der zu sehen In der Google Identity-Dokumentation verwende ich einen AuthorizationClient, um über das AuthenticationResult ein Zugriffstoken zu erhalten:
[code]List requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build();
Identity.getAuthorizationClient(this)
.authorize(authorizationRequest)
.addOnSuccessListener(
authorizationResult -> {
if (authorizationResult.hasResolution()) {
// Access needs to be granted by the user
PendingIntent pendingIntent = authorizationResult.getPendingIntent();
try {
startIntentSenderForResult(pendingIntent.getIntentSender(), REQUEST_AUTHORIZE, null, 0, 0, 0, null);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage());
}
} else {
// Access already granted, continue with user action
saveToDriveAppFolder(authorizationResult);
}
})
.addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
[/code]
[code]@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == MainActivity.REQUEST_AUTHORIZE) {
AuthorizationResult authorizationResult = Identity.getAuthorizationClient(this).getAuthorizationResultFromIntent(data);
saveToDriveAppFolder(authorizationResult);
}
}
[/code]
Und dann daraus eine Drive-Instanz erstellen:
[code]Drive.Builder(
GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance(),
HttpCredentialsAdapter(GoogleCredentials.create(AccessToken(authorizationResult.getAccessToken(), null)))
).build()
[/code]
So weit, so gut, alles funktioniert gut, aber da AuthorizationResult kein Aktualisierungstoken enthält – wie soll ich mit dem Ablauf des Zugriffstokens umgehen? Die App soll im Hintergrund ohne Benutzerinteraktionen synchronisiert werden, daher werde ich den Autorisierungsfluss nicht erneut starten (es sei denn, er wird natürlich widerrufen).
Mir ist bekannt, dass getServerAuthCode( ) könnte an Ihr Backend gesendet werden, um ein Paar Zugriffs-/Aktualisierungstoken für den serverseitigen Zugriff anzufordern, aber ich muss (oder möchte) nicht serverseitig auf die Daten meines Benutzers zugreifen.Vermisse ich? etwas?