Ejemplo n.º 1
0
        public async Task Refresh_token_should_be_retained_if_token_response_contains_only_access_token()
        {
            var document = File.ReadAllText(FileName.Create("success_access_token_response.json"));
            var handler  = new NetworkHandler(document, HttpStatusCode.OK);

            var tokenClient = new TokenClient(
                "http://server/token",
                "client",
                handler);

            var indirectOutputOfHttpResponses = new StubHttpResponsesHandler();
            var refreshHandler = new RefreshTokenHandler(
                tokenClient,
                "refresh_token",
                "access_token",
                indirectOutputOfHttpResponses);

            var apiClient = new HttpClient(refreshHandler);

            await apiClient.GetStringAsync("http://someapi/somecall");

            refreshHandler.RefreshToken
            .Should()
            .Be("refresh_token", "Refresh token should be retained if token response contains only access token");
        }
Ejemplo n.º 2
0
        protected async Task <bool> RefreshAccessTokenAsync(CancellationToken ct)
        {
            if (RefreshTokenHandler == null)
            {
                return(false);
            }

            var refreshToken = await RefreshTokenHandler.RetrieveRefreshTokenAsync(ct).ConfigureAwait(false);

            if (refreshToken?.RefreshToken == null)
            {
                return(false);
            }

            var parameters = new Dictionary <string, string>(StringComparer.Ordinal);

            parameters["client_id"]    = ApplicationId;
            parameters["redirect_uri"] = ReturnUrl;
            //parameters["client_secret"] = "";
            parameters["refresh_token"] = refreshToken.RefreshToken;
            parameters["grant_type"]    = "refresh_token";
            var result = await PostAsync <OneDriveToken>("https://login.live.com/oauth20_token.srf", new FormUrlEncodedContent(parameters), ct).ConfigureAwait(false);

            await HandleTokenResponseAsync(result, ct).ConfigureAwait(false);

            return(IsAuthenticated);
        }
Ejemplo n.º 3
0
        public async Task The_401_response_that_causes_token_refresh_and_retry_should_be_disposed_to_unblock_socket()
        {
            var document = File.ReadAllText(FileName.Create("success_token_response.json"));
            var handler  = new NetworkHandler(document, HttpStatusCode.OK);

            var tokenClient = new TokenClient(
                "http://server/token",
                "client",
                handler);

            var tokenResponse = await tokenClient.RequestClientCredentialsAsync();

            var indirectOutputOfHttpResponses = new StubHttpResponsesHandler();
            var refreshHandler = new RefreshTokenHandler(
                tokenClient,
                tokenResponse.RefreshToken,
                tokenResponse.AccessToken,
                indirectOutputOfHttpResponses);

            var apiClient = new HttpClient(refreshHandler);

            await apiClient.GetStringAsync("http://someapi/somecall");

            indirectOutputOfHttpResponses.FirstAttempt401Response
            .Disposed
            .Should()
            .BeTrue("Unauthorized response should be disposed to avoid socket blocking");
        }
Ejemplo n.º 4
0
            public void AuthRefreshSetup(string newAccessToken, string newRefreshToken, bool returnError = false)
            {
                StartServer();
                var handler = new RefreshTokenHandler(newAccessToken, newRefreshToken, returnError);

                HttpMock.HttpMock
                .WhenPost(handler.TokenPath, context => true)
                .Do(context => { handler.Handle(context); });
            }
Ejemplo n.º 5
0
        private async Task HandleTokenResponseAsync(OneDriveToken result, CancellationToken ct)
        {
            if (result != null && RefreshTokenHandler != null)
            {
                var refreshTokenInfo = new RefreshTokenInfo(result.RefreshToken);
                await RefreshTokenHandler.SaveRefreshTokenAsync(refreshTokenInfo, ct).ConfigureAwait(false);
            }

            _accessCode = result?.AccessToken;
            UpdateCrendentials(_client);
        }
Ejemplo n.º 6
0
        public async Task LogOutAsync(bool removeRefreshToken, bool removeCookies, CancellationToken ct = default)
        {
            _accessCode = null;
            if (removeRefreshToken && RefreshTokenHandler != null)
            {
                await RefreshTokenHandler.DeleteRefreshTokenAsync(ct).ConfigureAwait(false);
            }

            if (removeCookies)
            {
                string logoutUrl = $"https://login.live.com/oauth20_logout.srf?client_id={Uri.EscapeDataString(ApplicationId)}&redirect_uri={Uri.EscapeDataString(ReturnUrl)}";
                await GetAsync(logoutUrl, ct).ConfigureAwait(false);
            }
        }
Ejemplo n.º 7
0
        public async Task ExecuteAsync(CommandContext context)
        {
            context.Console.WriteLine($"Saving Server Url: {this.ServiceUrl}");
            context.Console.WriteLine($"Logging in to {this.Authority} ({this.api.Title} v{this.api.Version} running on {this.api.OS})...");

            var data = context.Repository.GetCommandData();

            if (data != null && data.Authority == this.Authority)
            {
                // already logged in?
                var discoveryResponse = default(DiscoveryResponse);
                using (var discoveryClient = new DiscoveryClient(this.Authority))
                {
                    discoveryResponse = await discoveryClient.GetAsync().ConfigureAwait(false);

                    if (!discoveryResponse.IsError)
                    {
                        using (var tokenClient = new TokenClient(discoveryResponse.TokenEndpoint, "donut_console"))
                            using (var refreshTokenHandler = new RefreshTokenHandler(tokenClient, data.RefreshToken, data.AccessToken))
                                using (var userInfoClient = new UserInfoClient(discoveryResponse.UserInfoEndpoint, refreshTokenHandler))
                                {
                                    var response = await userInfoClient.GetAsync(data.AccessToken).ConfigureAwait(false);

                                    if (!response.IsError)
                                    {
                                        var claimsIdentity = new ClaimsIdentity(response.Claims, "idSvr", "name", "role");
                                        context.Console.WriteLine($"Logged in as {claimsIdentity.Name}.");
                                        return;
                                    }
                                }
                    }
                }
            }

            var browser = new SystemBrowser();
            var options = new OidcClientOptions
            {
                Authority    = this.Authority,
                ClientId     = "donut_console",
                RedirectUri  = $"http://127.0.0.1:{browser.Port}",
                Scope        = "openid profile users_api accounts_api offline_access",
                FilterClaims = false,
                Browser      = browser
            };

            var oidcClient = new OidcClient(options);
            var result     = await oidcClient.LoginAsync(new LoginRequest()).ConfigureAwait(false);

            if (result.IsError)
            {
                context.Console.Error.WriteLine($"Error attempting to log in:{Environment.NewLine}{result.Error}");
                return;
            }

            context.Repository.SetCommandData(
                new CommandData
            {
                Authority    = this.Authority,
                AccessToken  = result.AccessToken,
                RefreshToken = result.RefreshToken,
                ServiceUrl   = this.ServiceUrl,
            });

            context.Console.WriteLine($"Logged in as {result.User.Identity.Name}.");
        }
Ejemplo n.º 8
0
 public DeviceHttpClient(RefreshTokenHandler refreshTokenHandler)
     : base(refreshTokenHandler)
 {
     BaseAddress = new Uri(baseAddress);
     DefaultRequestHeaders.Add("ZUMO-API-VERSION", "2.0.0");
 }
Ejemplo n.º 9
0
        public async Task <int> TryRunAsync(string[] args)
        {
            CommandLineOptions options;

            try
            {
                options = CommandLineOptions.Parse(args, this.console);
            }
            catch (CommandParsingException ex)
            {
                new ConsoleReporter(this.console).Warn(ex.Message);
                return(1);
            }

            if (options == null)
            {
                return(1);
            }

            if (options.Help.HasValue())
            {
                return(2);
            }

            if (options.Command == null)
            {
                return(3);
            }

            var repository = new CommandDataRepository(this.provider);

            if (options.Command is LoginCommand.Reset)
            {
                await options.Command.ExecuteAsync(new CommandContext(this.console, null, null, null, repository)).ConfigureAwait(false);

                return(0);
            }

            var data = repository.GetCommandData() ??
                       new CommandData
            {
                Authority  = LoginCommand.DefaultAuthority,
                ServiceUrl = LoginCommand.DefaultService,
            };

            var authority = data.Authority;
            var service   = data.ServiceUrl;

            if (options.Command is LoginCommand loginCommand)
            {
                authority = loginCommand.Authority;
                service   = loginCommand.ServiceUrl;
            }
            else
            {
                this.console.WriteLine("Executing command against ");
                this.console.ForegroundColor = ConsoleColor.White;
                this.console.WriteLine($"Authority: {authority}");
                this.console.WriteLine($"Service Url: {service}");
                this.console.ResetColor();
                this.console.WriteLine("...");
            }

            var discoveryResponse = default(DiscoveryResponse);

            using (var discoveryClient = new DiscoveryClient(authority))
            {
                discoveryResponse = await discoveryClient.GetAsync().ConfigureAwait(false);

                if (discoveryResponse.IsError)
                {
                    await this.console.Error.WriteLineAsync(discoveryResponse.Error).ConfigureAwait(false);

                    return(500);
                }
            }

            var api = default(Api);

            using (var client = new HttpClient())
            {
                try
                {
                    using (var response = client.GetAsync(new Uri($"{service}/platform")).GetAwaiter().GetResult())
                    {
                        response.EnsureSuccessStatusCode();
                        api = JsonConvert.DeserializeObject <Api>(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());
                    }
                }
                catch (HttpRequestException)
                {
                    await this.console.Error.WriteLineAsync($"Unable to connect to service: {service}.").ConfigureAwait(false);

                    return(500);
                }

                if (api == null)
                {
                    await this.console.Error.WriteLineAsync($"Invalid response from: {service}.").ConfigureAwait(false);

                    return(500);
                }
            }

            using (var tokenClient = new TokenClient(discoveryResponse.TokenEndpoint, "donut_console"))
                using (var refreshTokenHandler = new RefreshTokenHandler(tokenClient, data.RefreshToken, data.AccessToken))
                    using (var usersClient = new UsersHttpClient(service, refreshTokenHandler))
                        using (var assetAccountsClient = new AssetAccountsHttpClient(service, refreshTokenHandler))
                        {
                            refreshTokenHandler.TokenRefreshed += (sender, e) =>
                            {
                                repository.SetCommandData(
                                    new CommandData
                                {
                                    Authority    = authority,
                                    AccessToken  = e.AccessToken,
                                    RefreshToken = e.RefreshToken,
                                    ServiceUrl   = service,
                                });
                            };

                            var reporter = new ConsoleReporter(this.console, options.Verbose.HasValue(), false);
                            var context  = new CommandContext(this.console, reporter, usersClient, assetAccountsClient, repository);

                            try
                            {
                                await options.Command.ExecuteAsync(context).ConfigureAwait(false);
                            }
                            catch (Exception ex)
                            {
                                reporter.Error(ex.Message);
                                return(500);
                            }
                            finally
                            {
                                this.console.ResetColor();
                            }

                            return(0);
                        }
        }
 public RefreshTokenHandlerTests()
 {
     _mocker  = new AutoMocker();
     _handler = _mocker.CreateInstance <RefreshTokenHandler>();
 }
Ejemplo n.º 11
0
        public async Task <int> TryRunAsync(string[] args)
        {
            CommandLineOptions options;

            try
            {
                options = CommandLineOptions.Parse(args, this.console);
            }
            catch (CommandParsingException ex)
            {
                new ConsoleReporter(this.console).Warn(ex.Message);
                return(1);
            }

            if (options == null)
            {
                return(1);
            }

            if (options.Help.HasValue())
            {
                return(2);
            }

            if (options.Command == null)
            {
                return(3);
            }

            var repository = new CommandDataRepository(this.provider);

            if (options.Command is LoginCommand.Reset)
            {
                await options.Command.ExecuteAsync(new CommandContext(this.console, null, null, null, null, null, null, repository)).ConfigureAwait(false);

                return(0);
            }

            var data = repository.GetCommandData() ??
                       new CommandData
            {
                Authority = LoginCommand.ProductionAuthority,
            };

            var authority = data.Authority;

            if (options.Command is LoginCommand loginCommand)
            {
                authority = loginCommand.Authority;
            }
            else
            {
                this.console.Write("Executing command against ");
                this.console.ForegroundColor = ConsoleColor.White;
                this.console.Write(authority);
                this.console.ResetColor();
                this.console.WriteLine("...");
            }

            var discoveryResponse = default(DiscoveryResponse);

            using (var discoveryClient = new DiscoveryClient(authority))
            {
                discoveryResponse = await discoveryClient.GetAsync().ConfigureAwait(false);

                if (discoveryResponse.IsError)
                {
                    await this.console.Error.WriteLineAsync(discoveryResponse.Error).ConfigureAwait(false);

                    return(500);
                }
            }

            using (var tokenClient = new TokenClient(discoveryResponse.TokenEndpoint, "auth_console"))
                using (var refreshTokenHandler = new RefreshTokenHandler(tokenClient, data.RefreshToken, data.AccessToken))
                    using (var clientsClient = new ClientsHttpClient(authority, refreshTokenHandler))
                        using (var apiResourcesClient = new ApiResourcesHttpClient(authority, refreshTokenHandler))
                            using (var identityResourcesClient = new IdentityResourcesHttpClient(authority, refreshTokenHandler))
                                using (var rolesClient = new RolesHttpClient(authority, refreshTokenHandler))
                                    using (var usersClient = new UsersHttpClient(authority, refreshTokenHandler))
                                    {
                                        refreshTokenHandler.TokenRefreshed += (sender, e) =>
                                        {
                                            repository.SetCommandData(
                                                new CommandData
                                            {
                                                Authority    = authority,
                                                AccessToken  = e.AccessToken,
                                                RefreshToken = e.RefreshToken,
                                            });
                                        };

                                        var reporter = new ConsoleReporter(this.console, options.Verbose.HasValue(), false);
                                        var context  = new CommandContext(this.console, reporter, clientsClient, apiResourcesClient, identityResourcesClient, rolesClient, usersClient, repository);

                                        try
                                        {
                                            await options.Command.ExecuteAsync(context).ConfigureAwait(false);
                                        }
                                        catch (Exception ex)
                                        {
                                            reporter.Error(ex.Message);
                                            return(500);
                                        }
                                        finally
                                        {
                                            this.console.ResetColor();
                                        }

                                        return(0);
                                    }
        }
Ejemplo n.º 12
0
        public RefreshTokenHandlerTests()
        {
            _tokenRepositoryMock = new Mock <ITokenRepository>();

            _refreshTokenHandler = new RefreshTokenHandler(_tokenRepositoryMock.Object);
        }