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 void EnsureStateEquals(QueryValues queryValues, OAuthRequestCode request)
        {
            var requested = request.State;

            if (requested == null)
            {
                return;
            }

            var responsed = queryValues.Single("state");

            if (requested.Equals(responsed) == false)
            {
                throw new TwitchException($"OAuth state mismatched - Request:{requested} vs Response:{responsed})");
            }
        }
        public string GetCodeAuthorizeUri(OAuthRequestCode request)
        {
            var apiRequest = new TwitchAPIRequest();

            apiRequest.BaseUrl = "https://id.twitch.tv/oauth2/authorize";
            apiRequest.Method  = "GET";
            apiRequest.QueryValues.Add("client_id", this.Parent.ClientId);
            apiRequest.QueryValues.Add("response_type", request.ResponseType);
            apiRequest.QueryValues.Add("redirect_uri", request.RedirectUri);
            apiRequest.QueryValues.Add("scope", string.Join(OAuthRequest.ScopeSeparater, request.Scopes));
            apiRequest.QueryValues.Add("force_verify", request.ForceVerify);
            apiRequest.QueryValues.Add("state", request.State);

            using (var response = this.Parent.Request(apiRequest))
            {
                return(response.ResponseUri.AbsoluteUri);
            }
        }