Exemple #1
0
        public async Task <OAuth2TokenResult> GetOAuthTokenViaBrowserAsync(Uri targetUri, IEnumerable <string> scopes)
        {
            ThrowIfUserInteractionDisabled();

            var oauthClient = new GitHubOAuth2Client(HttpClient, Context.Settings, targetUri);

            // We require a desktop session to launch the user's default web browser
            if (!Context.SessionManager.IsDesktopSession)
            {
                throw new InvalidOperationException("Browser authentication requires a desktop session");
            }

            var browserOptions = new OAuth2WebBrowserOptions
            {
                SuccessResponseHtml       = GitHubResources.AuthenticationResponseSuccessHtml,
                FailureResponseHtmlFormat = GitHubResources.AuthenticationResponseFailureHtmlFormat
            };
            var browser = new OAuth2SystemWebBrowser(Context.Environment, browserOptions);

            // Write message to the terminal (if any is attached) for some feedback that we're waiting for a web response
            Context.Terminal.WriteLine("info: please complete authentication in your browser...");

            OAuth2AuthorizationCodeResult authCodeResult =
                await oauthClient.GetAuthorizationCodeAsync(scopes, browser, CancellationToken.None);

            return(await oauthClient.GetTokenByAuthorizationCodeAsync(authCodeResult, CancellationToken.None));
        }
        public async Task OAuth2Client_GetAuthorizationCodeAsync()
        {
            const string expectedAuthCode = "68c39cbd8d";

            var baseUri = new Uri("https://example.com");
            OAuth2ServerEndpoints endpoints = CreateEndpoints(baseUri);

            var httpHandler = new TestHttpMessageHandler {
                ThrowOnUnexpectedRequest = true
            };

            string[] expectedScopes = { "read", "write", "delete" };

            OAuth2Application app = CreateTestApplication();

            var server = new TestOAuth2Server(endpoints);

            server.RegisterApplication(app);
            server.Bind(httpHandler);
            server.TokenGenerator.AuthCodes.Add(expectedAuthCode);

            IOAuth2WebBrowser browser = new TestOAuth2WebBrowser(httpHandler);

            OAuth2Client client = CreateClient(httpHandler, endpoints);

            OAuth2AuthorizationCodeResult result = await client.GetAuthorizationCodeAsync(expectedScopes, browser, CancellationToken.None);

            Assert.Equal(expectedAuthCode, result.Code);
        }
 private void VerifyAuthorizationCodeResult(OAuth2AuthorizationCodeResult result)
 {
     Assert.NotNull(result);
     Assert.Equal(authorization_code, result.Code);
     Assert.Equal(rootCallbackUri, result.RedirectUri);
     Assert.Equal(pkceCodeVerifier, result.CodeVerifier);
 }
        public async Task OAuth2Client_E2E_InteractiveWebFlowAndRefresh()
        {
            const string expectedAuthCode      = "e78a711d11";
            const string expectedAccessToken1  = "LET_ME_IN-1";
            const string expectedAccessToken2  = "LET_ME_IN-2";
            const string expectedRefreshToken1 = "REFRESH_ME-1";
            const string expectedRefreshToken2 = "REFRESH_ME-2";

            var baseUri = new Uri("https://example.com");
            OAuth2ServerEndpoints endpoints = CreateEndpoints(baseUri);

            var httpHandler = new TestHttpMessageHandler {
                ThrowOnUnexpectedRequest = true
            };

            string[] expectedScopes = { "read", "write", "delete" };

            OAuth2Application app = CreateTestApplication();

            var server = new TestOAuth2Server(endpoints);

            server.RegisterApplication(app);
            server.Bind(httpHandler);
            server.TokenGenerator.AuthCodes.Add(expectedAuthCode);
            server.TokenGenerator.AccessTokens.Add(expectedAccessToken1);
            server.TokenGenerator.RefreshTokens.Add(expectedRefreshToken1);

            IOAuth2WebBrowser browser = new TestOAuth2WebBrowser(httpHandler);

            OAuth2Client client = CreateClient(httpHandler, endpoints);

            OAuth2AuthorizationCodeResult authCodeResult = await client.GetAuthorizationCodeAsync(
                expectedScopes, browser, CancellationToken.None);

            OAuth2TokenResult result1 = await client.GetTokenByAuthorizationCodeAsync(authCodeResult, CancellationToken.None);

            Assert.NotNull(result1);
            Assert.Equal(expectedScopes, result1.Scopes);
            Assert.Equal(expectedAccessToken1, result1.AccessToken);
            Assert.Equal(expectedRefreshToken1, result1.RefreshToken);

            server.TokenGenerator.AccessTokens.Add(expectedAccessToken2);
            server.TokenGenerator.RefreshTokens.Add(expectedRefreshToken2);

            OAuth2TokenResult result2 = await client.GetTokenByRefreshTokenAsync(result1.RefreshToken, CancellationToken.None);

            Assert.NotNull(result2);
            Assert.Equal(expectedScopes, result2.Scopes);
            Assert.Equal(expectedAccessToken2, result2.AccessToken);
            Assert.Equal(expectedRefreshToken2, result2.RefreshToken);
        }
Exemple #5
0
        public async Task <OAuth2TokenResult> GetOAuthTokenAsync(Uri targetUri, IEnumerable <string> scopes)
        {
            ThrowIfUserInteractionDisabled();

            var oauthClient = new GitHubOAuth2Client(HttpClient, Context.Settings, targetUri);

            // If we have a desktop session try authentication using the user's default web browser
            if (Context.SessionManager.IsDesktopSession)
            {
                var browserOptions = new OAuth2WebBrowserOptions
                {
                    SuccessResponseHtml       = GitHubResources.AuthenticationResponseSuccessHtml,
                    FailureResponseHtmlFormat = GitHubResources.AuthenticationResponseFailureHtmlFormat
                };
                var browser = new OAuth2SystemWebBrowser(browserOptions);

                // Write message to the terminal (if any is attached) for some feedback that we're waiting for a web response
                Context.Terminal.WriteLine("info: please complete authentication in your browser...");

                OAuth2AuthorizationCodeResult authCodeResult = await oauthClient.GetAuthorizationCodeAsync(scopes, browser, CancellationToken.None);

                return(await oauthClient.GetTokenByAuthorizationCodeAsync(authCodeResult, CancellationToken.None));
            }
            else
            {
                ThrowIfTerminalPromptsDisabled();

                if (GitHubConstants.IsOAuthDeviceAuthSupported)
                {
                    OAuth2DeviceCodeResult deviceCodeResult = await oauthClient.GetDeviceCodeAsync(scopes, CancellationToken.None);

                    string deviceMessage = $"To complete authentication please visit {deviceCodeResult.VerificationUri} and enter the following code:" +
                                           Environment.NewLine +
                                           deviceCodeResult.UserCode;
                    Context.Terminal.WriteLine(deviceMessage);

                    return(await oauthClient.GetTokenByDeviceCodeAsync(deviceCodeResult, CancellationToken.None));
                }

                // We'd like to try using an OAuth2 flow that does not require a web browser on this device
                // such as the device code flow (RFC 8628) but GitHub's auth stack does not support this.
                throw new NotSupportedException("GitHub OAuth authentication is not supported without an interactive desktop session.");
            }
        }
        public async Task OAuth2Client_GetTokenByAuthorizationCodeAsync()
        {
            const string authCode             = "a63ef59691";
            const string expectedAccessToken  = "LET_ME_IN";
            const string expectedRefreshToken = "REFRESH_ME";

            var baseUri = new Uri("https://example.com");
            OAuth2ServerEndpoints endpoints = CreateEndpoints(baseUri);

            var httpHandler = new TestHttpMessageHandler {
                ThrowOnUnexpectedRequest = true
            };

            string[] expectedScopes = { "read", "write", "delete" };

            OAuth2Application app = CreateTestApplication();

            app.AuthGrants.Add(new OAuth2Application.AuthCodeGrant(authCode, expectedScopes));

            var server = new TestOAuth2Server(endpoints);

            server.RegisterApplication(app);
            server.Bind(httpHandler);
            server.TokenGenerator.AccessTokens.Add(expectedAccessToken);
            server.TokenGenerator.RefreshTokens.Add(expectedRefreshToken);

            OAuth2Client client = CreateClient(httpHandler, endpoints);

            var authCodeResult       = new OAuth2AuthorizationCodeResult(authCode, TestRedirectUri);
            OAuth2TokenResult result = await client.GetTokenByAuthorizationCodeAsync(authCodeResult, CancellationToken.None);

            Assert.NotNull(result);
            Assert.Equal(expectedScopes, result.Scopes);
            Assert.Equal(expectedAccessToken, result.AccessToken);
            Assert.Equal(expectedRefreshToken, result.RefreshToken);
        }