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); } }