getSessionFromUrl method
Gets the session data from a magic link or oauth2 callback URL
Implementation
Future<AuthSessionUrlResponse> getSessionFromUrl(
Uri originUrl, {
bool storeSession = true,
}) async {
var url = originUrl;
if (originUrl.hasQuery) {
final decoded = originUrl.toString().replaceAll('#', '&');
url = Uri.parse(decoded);
} else {
final decoded = originUrl.toString().replaceAll('#', '?');
url = Uri.parse(decoded);
}
final errorDescription = url.queryParameters['error_description'];
if (errorDescription != null) {
throw AuthException(errorDescription);
}
if (_flowType == AuthFlowType.pkce) {
final authCode = originUrl.queryParameters['code'];
if (authCode == null) {
throw AuthPKCEGrantCodeExchangeError(
'No code detected in query parameters.');
}
return await exchangeCodeForSession(authCode);
}
final accessToken = url.queryParameters['access_token'];
final expiresIn = url.queryParameters['expires_in'];
final refreshToken = url.queryParameters['refresh_token'];
final tokenType = url.queryParameters['token_type'];
final providerToken = url.queryParameters['provider_token'];
final providerRefreshToken = url.queryParameters['provider_refresh_token'];
if (accessToken == null) {
throw AuthException('No access_token detected.');
}
if (expiresIn == null) {
throw AuthException('No expires_in detected.');
}
if (refreshToken == null) {
throw AuthException('No refresh_token detected.');
}
if (tokenType == null) {
throw AuthException('No token_type detected.');
}
final user = (await getUser(accessToken)).user;
if (user == null) {
throw AuthException('No user found.');
}
final session = Session(
providerToken: providerToken,
providerRefreshToken: providerRefreshToken,
accessToken: accessToken,
expiresIn: int.parse(expiresIn),
refreshToken: refreshToken,
tokenType: tokenType,
user: user,
);
final redirectType = url.queryParameters['type'];
if (storeSession == true) {
_saveSession(session);
if (redirectType == 'recovery') {
notifyAllSubscribers(AuthChangeEvent.passwordRecovery);
} else {
notifyAllSubscribers(AuthChangeEvent.signedIn);
}
}
return AuthSessionUrlResponse(session: session, redirectType: redirectType);
}