authorizeInteractive static method
Future<AuthorizationResponse?>
authorizeInteractive({
- required BuildContext context,
- required String title,
- required InteractiveAuthorizationRequest request,
Implementation
static Future<AuthorizationResponse?> authorizeInteractive({
required BuildContext context,
required String title,
required InteractiveAuthorizationRequest request,
}) async {
late String? responseUrl;
final uri = Uri.parse(request.configuration.authorizationEndpoint).replace(
queryParameters: request.toMap(),
);
final targetPlatform = Theme.of(context).platform;
//These are special cases for the various different platforms because of limitations in pubspec.yaml
/*if (!kIsWeb && (Platform.isIOS || Platform.isAndroid)) {
responseUrl = await OpenIdConnectAndroidiOS.authorizeInteractive(
context: context,
title: title,
authorizationUrl: uri.toString(),
redirectUrl: request.redirectUrl,
popupHeight: request.popupHeight,
popupWidth: request.popupWidth,
useWebRedirectLoop: !request.useWebPopup,
);
} else*/
if (kIsWeb ||
(targetPlatform == TargetPlatform.iOS ||
targetPlatform == TargetPlatform.android)) {
final storage = FlutterSecureStorage();
await storage.write(
key: CODE_VERIFIER_STORAGE_KEY,
value: request.codeVerifier,
);
await storage.write(
key: CODE_CHALLENGE_STORAGE_KEY,
value: request.codeChallenge,
);
responseUrl = await _platform.authorizeInteractive(
context: context,
title: title,
authorizationUrl: uri.toString(),
redirectUrl: request.redirectUrl,
popupHeight: request.popupHeight,
popupWidth: request.popupWidth,
useWebRedirectLoop: !request.useWebPopup,
);
if (responseUrl == null) return null;
await storage.delete(key: CODE_VERIFIER_STORAGE_KEY);
await storage.delete(key: CODE_CHALLENGE_STORAGE_KEY);
} else {
//TODO add other implementations as they become available. For now, all desktop uses device code flow instead of authorization code flow
return await OpenIdConnect.authorizeDevice(
request: DeviceAuthorizationRequest(
audience: null,
clientId: request.clientId,
clientSecret: request.clientSecret,
configuration: request.configuration,
scopes: request.scopes,
additionalParameters: request.additionalParameters,
),
);
}
return await _completeCodeExchange(request: request, url: responseUrl);
}