public void SaveCredentials(IAptkAmaCredentials credentials) { if (credentials == null) { return; } Settings.AptkAmaIdentityProvider = credentials.Provider; Settings.AptkAmaIdentityUserId = credentials.User.UserId; Settings.AptkAmaIdentityAuthToken = credentials.User.MobileServiceAuthenticationToken; }
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); }
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); }