connect static method
Future<OneDriveProvider?>
connect({
- required String clientId,
- required String redirectUri,
- required BuildContext context,
- String? scopes,
Connects to OneDrive, handling both silent and interactive authentication.
Implementation
static Future<OneDriveProvider?> connect({
required String clientId,
required String redirectUri,
required BuildContext context,
String? scopes,
}) async {
// Client ID is mandatory for Azure App registration.
if (clientId.trim().isEmpty) {
throw ArgumentError(
'App registration required: https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade');
}
// Provides a fallback native client redirect URI if none is supplied.
if (redirectUri.isEmpty) {
redirectUri =
'https://login.microsoftonline.com/common/oauth2/nativeclient';
}
try {
final provider = OneDriveProvider._create(
clientId: clientId, redirectUri: redirectUri, context: context);
// Configure the client with appropriate scopes based on the desired access level.
provider.client = OneDrive(
clientID: clientId,
redirectURL: redirectUri,
scopes: scopes ??
"${MultiCloudStorage.cloudAccess == CloudAccessType.appStorage ? OneDrive.permissionFilesReadWriteAppFolder : OneDrive.permissionFilesReadWriteAll} offline_access User.Read Sites.ReadWrite.All",
);
// 1. First, attempt to connect silently using a stored token.
if (await provider.client.isConnected()) {
provider._isAuthenticated = true;
debugPrint("OneDriveProvider: Silently connected successfully.");
return provider;
}
// 2. If silent connection fails, fall back to interactive login via a WebView.
debugPrint(
"OneDriveProvider: Not connected, attempting interactive login...");
if (await provider.client.connect(context) == false) {
debugPrint(
"OneDriveProvider: Interactive login failed or was cancelled.");
return null; // User cancelled or login failed.
}
provider._isAuthenticated = true;
debugPrint("OneDriveProvider: Interactive login successful.");
return provider;
} on SocketException catch (e) {
debugPrint('No connection detected.');
throw NoConnectionException(e.message);
} catch (e) {
debugPrint('Exception ${e.toString()}');
rethrow;
}
}