- 
                Notifications
    
You must be signed in to change notification settings  - Fork 171
 
Open
Description
I have a subscription to my Firebase.Database, however, if the application runs for 60 minutes, it throws an exception.
I found some old issues and a PR for the token refreshing, however it still is not working for me.
Here is what I have.
// Create a client with the `login` function.
public FirebaseClient ConnectWithLogin(Func<Task<string>> login)
{
    return new(baseUri, new FirebaseOptions
    {
        AuthTokenAsyncFactory = async() => await login().ConfigureAwait(false)
    });
}The login function looks like this.
public async Task<string> LoginSubscribeAndGetTokenAsync(string username, string password)
{
    if (authClient is null || CurrentUser is null) return string.Empty;
    // Avoid multiple logins if the session is actually still valid and the user hasn't changed
    if(CurrentUser?.User?.Info?.Email == username && CurrentUser?.User?.Credential.IsExpired() is false)
    {
        return CurrentUser?.User?.Credential?.IdToken ?? string.Empty;
    }
    CurrentUser = await authClient.SignInWithEmailAndPasswordAsync(username, password);
    // Refresh the token, so that the client is updated afterwards
    Token = await CurrentUser.User.GetIdTokenAsync() ?? string.Empty;
    return Token;
}// The function for starting the subscription
public void Subscribe<T>(Action<Tuple<string, T>> action, string username, string password, string child = "settings")
{
    try
    {
        // Don't sync user data for anonymous logins
        if (CurrentUser?.User is null || CurrentUser.User.IsAnonymous == true) return;
        if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) return;
        // Auth must be a function, otherwise the expired token cannot be refreshed.
        client = ConnectWithLogin(() => LoginSubscribeAndGetTokenAsync(username, password));
        IDisposable observable = client
            .Child("users")
            .Child(CurrentUser.User.Uid)
            .Child(child)
            .AsObservable<T>()
            .Subscribe(data =>
            {
                try
                {
                    action?.Invoke(new Tuple<string, T>(data.Key, data.Object));
                }
                catch(Exception ex)
                {
                    EventManager.Instance.LogError(ex);
                    Unsubscribe<T>();
                }
            });
    }
    catch (Exception exc)
    {
        // Log error
        EventManager.Instance.LogError(exc);
    }
}Maybe you can see what's wrong on my code?
Thanks a lot!
Metadata
Metadata
Assignees
Labels
No labels