public AuthenticationResult GetAuthenticationResult(Uri responseUri, OAuthRequestCode request)
        {
            QueryValues          queryValues;
            AuthenticationResult result;

            if (request is OAuthRequestAuthorizationCode auth)
            {
                queryValues = QueryValues.Parse(StringUtils.RemovePrefix(responseUri.Query, "?"));
                this.EnsureStateEquals(queryValues, request);

                var accessTokenRequest = new OAuthTokenRequest();
                accessTokenRequest.ClientSecret = auth.ClientSecret;
                accessTokenRequest.Code         = queryValues.Single("code");
                accessTokenRequest.GrantType    = "authorization_code";
                accessTokenRequest.RedirectUri  = auth.RedirectUri;
                result = this.GetAuthenticationResult(accessTokenRequest);
            }
            else if (request is OAuthRequestTokenCode)
            {
                queryValues = QueryValues.Parse(HttpUtility.UrlDecode(StringUtils.RemovePrefix(responseUri.Fragment, "#")));
                this.EnsureStateEquals(queryValues, request);

                result = new AuthenticationResult(queryValues);
            }
            else
            {
                throw new ArgumentException("Invalid OAuthRequest Type", nameof(request));
            }

            return(result);
        }
        public AuthenticationResult GetAuthenticationResult(OAuthRequestClientCredentials request)
        {
            var tokenRequest = new OAuthTokenRequest();

            tokenRequest.ClientSecret = request.ClientSecret;
            tokenRequest.GrantType    = "client_credentials";
            tokenRequest.Scopes.AddRange(request.Scopes);

            return(this.GetAuthenticationResult(tokenRequest));
        }
        public AuthenticationResult GetAuthenticationResult(OAuthTokenRequest request)
        {
            var apiRequest = new TwitchAPIRequest();

            apiRequest.BaseUrl = "https://id.twitch.tv/oauth2/token";
            apiRequest.Method  = "POST";
            apiRequest.QueryValues.Add("client_id", this.Parent.ClientId);
            apiRequest.QueryValues.Add("client_secret", request.ClientSecret);
            apiRequest.QueryValues.Add("code", request.Code);
            apiRequest.QueryValues.Add("grant_type", request.GrantType);
            apiRequest.QueryValues.Add("redirect_uri", request.RedirectUri);
            apiRequest.QueryValues.Add("scope", string.Join(OAuthRequest.ScopeSeparater, request.Scopes));
            var jToken = this.Parent.RequestAsJson(apiRequest, "status");

            return(new AuthenticationResult(jToken));
        }