Implementation
Future<void> signIn(String redirectUri) async {
if (_loading) {
throw LogtoAuthException(
LogtoAuthExceptions.isLoadingError, 'Already signing in...');
}
final httpClient = _httpClient ?? http.Client();
try {
_loading = true;
_pkce = PKCE.generate();
_state = utils.generateRandomString();
_tokenStorage.setIdToken(null);
final oidcConfig = await _getOidcConfig(httpClient);
final signInUri = logto_core.generateSignInUri(
authorizationEndpoint: oidcConfig.authorizationEndpoint,
clientId: config.appId,
redirectUri: redirectUri,
codeChallenge: _pkce.codeChallenge,
state: _state,
resources: config.resources,
scopes: config.scopes,
);
String? callbackUri;
final redirectUriScheme = Uri.parse(redirectUri).scheme;
callbackUri = await FlutterWebAuth.authenticate(
url: signInUri.toString(),
callbackUrlScheme: redirectUriScheme,
preferEphemeral: true,
);
await _handleSignInCallback(callbackUri, redirectUri, httpClient);
} finally {
_loading = false;
if (_httpClient == null) httpClient.close();
}
}