Beispiel #1
0
 public void Setup()
 {
     _authenticator =
         RsdnClientHelpers.CreateAuthenticator(
             TestsBase.ServiceUri,
             TestsBase.TestClientID,
             TestsBase.TestClientSecret,
             "offline_access",
             false);
 }
Beispiel #2
0
        public static async Task <TokenFactory> SignInAsync(CancellationToken cancellation = default)
        {
            var port          = GetFreeTcpPort();
            var redirectUri   = $"http://127.0.0.1:{port}/";
            var authenticator = RsdnClientHelpers.CreateAuthenticator(
                //new Uri("https://localhost:44389"),
                new Uri("https://api.rsdn.org"),
                "test_public_client",
                "",
                "offline_access");
            {
                using var httpListener = new HttpListener();
                httpListener.Prefixes.Add(redirectUri);
                httpListener.Start();

                var flowData = authenticator.GetCodeFlowData(redirectUri);
                OpenBrowser(flowData.AuthUri);

                var context = await httpListener.GetContextAsync();

                var response       = context.Response;
                var responseString = "<html><head></head><body>Please return to the app.</body></html>";
                var buffer         = Encoding.UTF8.GetBytes(responseString);
                response.ContentLength64 = buffer.Length;
                var responseOutput = response.OutputStream;
                await responseOutput.WriteAsync(
                    buffer,
                    0,
                    buffer.Length,
                    cancellation);

                await responseOutput.FlushAsync(cancellation);

                responseOutput.Close();
                await Task.Delay(500, cancellation);                 // Wait for browser to get all data

                httpListener.Stop();

                var qs             = context.Request.QueryString;
                var redirectParams = qs.AllKeys.ToDictionary(key => key, key => qs[key]);

                // Store token in closure.
                // Actual implementation should use ProtectedData or Windows Credentials Manager to store token on
                // persistent storage
                var token = await authenticator.GetTokenByCodeAsync(flowData, redirectParams, cancellation);

                return(authenticator.GetAccessTokenFactory(() => token, t => token = t));
            }
        }
Beispiel #3
0
        public async Task NonConfidentialClient()
        {
            var authenticator = RsdnClientHelpers.CreateAuthenticator(
                TestsBase.ServiceUri,
                "test_public_client",
                null,
                "offline_access",
                false);
            var token = await authenticator.GetTokenByPasswordAsync(
                TestsBase.TestUserLogin,
                TestsBase.TestUserPassword);

            Assert.IsTrue(token.AccessToken.NotNullNorWhiteSpace());
            Assert.IsTrue(token.RefreshToken.NotNullNorWhiteSpace());
            Assert.NotZero(token.ExpiresIn);
        }
Beispiel #4
0
        public void BadClientSecret()
        {
            var authenticator =
                RsdnClientHelpers.CreateAuthenticator(
                    TestsBase.ServiceUri,
                    TestsBase.TestClientID,
                    "BadSecret",
                    "offline_access",
                    false);
            var ex = Assert.ThrowsAsync <RsdnServiceException>(async() =>
                                                               await authenticator.GetTokenByPasswordAsync(
                                                                   TestsBase.TestUserLogin,
                                                                   TestsBase.TestUserPassword));

            Assert.AreEqual(HttpStatusCode.Unauthorized, ex.StatusCode);
            Assert.AreEqual($"{WellKnownAuthErrors.BaseUri}/InvalidClient", ex.ErrorCode);
        }
Beispiel #5
0
        public ApiConnectionService(AccountsService accountsService)
        {
            _accountsService = accountsService;

            _authenticator = RsdnClientHelpers.CreateAuthenticator(
                //new Uri("https://localhost:44389"),
                _rsdnUri,
                "test_public_client",
                "",
                "offline_access");
            _token = _accountsService.GetCurrentToken();
            Client = RsdnClientHelpers.CreateClient(
                _rsdnUri,
                _authenticator.GetAccessTokenFactory(
                    () => _token,
                    token =>
            {
                accountsService.SetCurrentToken(token);
                _token = token;
            }));
        }