Ejemplo n.º 1
0
        public void SaveCredentials(IAptkAmaCredentials credentials)
        {
            if (credentials == null)
            {
                return;
            }

            Settings.AptkAmaIdentityProvider  = credentials.Provider;
            Settings.AptkAmaIdentityUserId    = credentials.User.UserId;
            Settings.AptkAmaIdentityAuthToken = credentials.User.MobileServiceAuthenticationToken;
        }
Ejemplo n.º 2
0
        public bool TryLoadCredentials(out IAptkAmaCredentials credentials)
        {
            credentials = !string.IsNullOrEmpty(Settings.AptkAmaIdentityUserId) &&
                          !string.IsNullOrEmpty(Settings.AptkAmaIdentityAuthToken) &&
                          Settings.AptkAmaIdentityProvider != AptkAmaAuthenticationProvider.None
                ? new AptkAmaCredentials(Settings.AptkAmaIdentityProvider, new MobileServiceUser(Settings.AptkAmaIdentityUserId)
            {
                MobileServiceAuthenticationToken = Settings.AptkAmaIdentityAuthToken
            })
                : null;

            return(credentials != null);
        }
Ejemplo n.º 3
0
        protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var response = await base.SendAsync(request, cancellationToken);

            if (response.StatusCode == HttpStatusCode.Unauthorized && !_isResfreshingUser)
            {
                // Resolve IMvxAmsService if not yet defined
                if (AptkAmaService == null)
                {
                    throw new InvalidOperationException("Make sure to configure AptkAma plugin properly before using it.");
                }

                // Cloning the request
                var clonedRequest = await CloneRequest(request);

                // Load saved user if possible
                if (_configuration.CacheService != null &&
                    _configuration.CacheService.TryLoadCredentials(out _credentials) &&
                    (AptkAmaService.Identity.CurrentUser == null ||
                     (AptkAmaService.Identity.CurrentUser.UserId != _credentials.User.UserId &&
                      AptkAmaService.Identity.CurrentUser.MobileServiceAuthenticationToken != _credentials.User.MobileServiceAuthenticationToken)))
                {
                    AptkAmaService.Identity.CurrentUser = _credentials.User;

                    clonedRequest.Headers.Remove("X-ZUMO-AUTH");
                    // Set the authentication header
                    clonedRequest.Headers.Add("X-ZUMO-AUTH", _credentials.User.MobileServiceAuthenticationToken);

                    // Resend the request
                    response = await base.SendAsync(clonedRequest, cancellationToken);

                    // Refresh the token
                    if (response.StatusCode == HttpStatusCode.Unauthorized)
                    {
                        _isResfreshingUser = true;
                        await AptkAmaService.Identity.RefreshUserAsync();

                        _isResfreshingUser = false;

                        clonedRequest.Headers.Remove("X-ZUMO-AUTH");
                        // Set the authentication header
                        clonedRequest.Headers.Add("X-ZUMO-AUTH", _credentials.User.MobileServiceAuthenticationToken);

                        // Resend the request
                        response = await base.SendAsync(clonedRequest, cancellationToken);
                    }
                }

                if (response.StatusCode == HttpStatusCode.Unauthorized &&
                    _credentials != null &&
                    _credentials.Provider != AptkAmaAuthenticationProvider.None &&
                    _credentials.Provider != AptkAmaAuthenticationProvider.Custom)
                {
                    try
                    {
                        // Login user again
                        var user = await AptkAmaService.Identity.LoginAsync(_credentials.Provider);

                        // Save the user if possible
                        if (_credentials == null)
                        {
                            _credentials = new AptkAmaCredentials(_credentials.Provider, user);
                        }
                        _configuration.CacheService?.SaveCredentials(_credentials);

                        clonedRequest.Headers.Remove("X-ZUMO-AUTH");
                        // Set the authentication header
                        clonedRequest.Headers.Add("X-ZUMO-AUTH", user.MobileServiceAuthenticationToken);

                        // Resend the request
                        response = await base.SendAsync(clonedRequest, cancellationToken);
                    }
                    catch (InvalidOperationException)
                    {
                        // user cancelled auth, so lets return the original response
                        return(response);
                    }
                }

                if (response.StatusCode == HttpStatusCode.Unauthorized)
                {
                    _onLoggedOut?.Invoke();
                }
            }

            return(response);
        }