getSessionFromUrl method
Gets the session data from a oauth2 callback URL
Implementation
Future<GotrueSessionResponse> 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) {
return GotrueSessionResponse(error: GotrueError(errorDescription));
}
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'];
if (accessToken == null) {
return GotrueSessionResponse(
error: GotrueError('No access_token detected.'),
);
}
if (expiresIn == null) {
return GotrueSessionResponse(
error: GotrueError('No expires_in detected.'),
);
}
if (refreshToken == null) {
return GotrueSessionResponse(
error: GotrueError('No refresh_token detected.'),
);
}
if (tokenType == null) {
return GotrueSessionResponse(
error: GotrueError('No token_type detected.'),
);
}
final response = await api.getUser(accessToken);
if (response.error != null) {
return GotrueSessionResponse(error: response.error);
}
final session = Session(
accessToken: accessToken,
expiresIn: int.parse(expiresIn),
refreshToken: refreshToken,
tokenType: tokenType,
providerToken: providerToken,
user: response.user,
);
if (storeSession == true) {
_saveSession(session);
_notifyAllSubscribers(AuthChangeEvent.signedIn);
final type = url.queryParameters['type'];
if (type == 'recovery') {
_notifyAllSubscribers(AuthChangeEvent.passwordRecovery);
}
}
return GotrueSessionResponse(data: session);
}