2016-01-09 4 views
1

Je suis nouveau ici et j'espère que quelqu'un peut m'aider. J'essaie de me connecter à twitch.tv J'essaye d'obtenir une authentification oauth2 sur twitch.tv avec un petit programme C#. J'utilise le twitch.tv authentication request. Voici mon code C#:Obtenir Erreur 400: Mauvaise demande à l'authentification via Twitch.tv api

var loginURL = "https://api.twitch.tv/kraken/oauth2/authorize? 
           response_type=code&"+ 
           client_id="+ clientID+" 
           "&redirect_uri=http://localhost&"+ 
           "state=TWStreamingStateAuthenticated";      
    this.richTextBox1.Text = loginURL; 
    string code = get_DownLoadString(loginURL); 
    this.richTextBox1.Text = code; 

Ceci est la partie, qui ne fonctionne pas. Il me donne le Erreur 400: Bad Request.

WebRequest request = WebRequest.Create("https://api.twitch.tv/kraken/oauth2/token"); 
    request.Method = "POST"; 
    string postData = "client_id=" + clientID + 
         "&client_secret=" + clientSecret + 
         "&grant_type=authorization_code" + 
         "&redirect_uri=http://localhost" + 
         "&code=" + code + 
         "&state=TWStreamingStateAuthenticated"; 

    ASCIIEncoding encoding = new ASCIIEncoding(); 
    postData = HttpUtility.UrlEncode(postData);    
    byte[] byteArray = encoding.GetBytes(postData); 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.ContentLength = byteArray.Length; 
    Stream datatream = request.GetRequestStream(); 
    datatream.Write(byteArray, 0, byteArray.Length); 
    datatream.Close(); 
    WebResponse respone = request.GetResponse(); 
    MessageBox.Show(((HttpWebResponse)respone).StatusDescription); 

J'espère que quelqu'un peut m'aider. Et voici la méthode Get_DownloadString (string URL).

private static string get_DownLoadString(string URL) 
{ 
    try 
    { 
     string temp = (new WebClient().DownloadString(URL)); 
     return temp; 
    } 
    catch (WebException) 
    { 
     return null; 
    } 
} 

Répondre

2

Ce code ne semble pas juste pour moi:

string postData = "client_id=" + clientID + 
         "&client_secret=" + clientSecret + 
         "&grant_type=authorization_code" + 
         "&redirect_uri=http://localhost" + 
         "&code=" + code + 
         "&state=TWStreamingStateAuthenticated"; 

    ASCIIEncoding encoding = new ASCIIEncoding(); 
    postData = HttpUtility.UrlEncode(postData); 
    byte[] byteArray = encoding.GetBytes(postData); 
    // ... 

Vous êtes URL codant pour l'ensemble de la chaîne de données post. Cela a pour effet de convertir les signes & et = dans les données de poste en %26 et %3d respectivement. Lorsque le serveur distant reçoit ces données, il les parcourt en recherchant les signes & et = afin de séparer les noms et les valeurs des paramètres. Bien sûr, il n'en trouvera pas, donc il supposera que vous avez un grand nom de paramètre sans valeur. Le serveur s'attend probablement à des valeurs pour chacun des six paramètres que vous tentez d'envoyer, mais ne voit aucune valeur pour aucun d'entre eux, ce qui explique peut-être pourquoi vous obtenez une erreur 400 Bad Request. Au lieu du codage d'URL de la chaîne entière, les valeurs de paramètre d'URL-encoder peuvent contenir des caractères autres que des lettres et des nombres. Je voudrais essayer ce qui suit à la place:

string postData = "client_id=" + HttpUtility.UrlEncode(clientID) + 
         "&client_secret=" + HttpUtility.UrlEncode(clientSecret) + 
         "&grant_type=authorization_code" + 
         "&redirect_uri=" + HttpUtility.UrlEncode("http://localhost") + 
         "&code=" + HttpUtility.UrlEncode(code) + 
         "&state=TWStreamingStateAuthenticated"; 

    ASCIIEncoding encoding = new ASCIIEncoding(); 
    byte[] byteArray = encoding.GetBytes(postData); 
    // ... 

De cette façon, le serveur distant verra toujours les caractères & et =, et sera donc en mesure de tirer les noms des paramètres et des valeurs. Étant donné que nous avons codé l'URL du client, le secret du client, l'URL et le code, tous les caractères qui peuvent avoir une signification dans une URL n'auront pas cette signification et seront reçus par le serveur distant comme prévu.

De même, si vous obtenez toujours une réponse d'erreur 400 Bad Request, essayez de lire le contenu du flux de réponses, obtenu en appelant GetResponseStream() sur la réponse. Souvent, cela contiendra un message qui vous aidera à comprendre ce qui ne va pas. Après avoir examiné de plus près votre code, il semble que vous ayez un malentendu sur le fonctionnement de l'authentification OAuth. Votre méthode getDownload_String n'obtiendra pas le code d'accès souhaité, mais seulement le texte HTML d'une page de connexion Twitch.

Voici comment fonctionne l'authentification OAuth:

  1. Votre application envoie à l'utilisateur à une URL de connexion, pour permettre à l'utilisateur de se connecter à Twitch.
  2. Dans le navigateur Web, l'utilisateur saisit ses informations de connexion et soumet la page à Twitch.
  3. L'API Twitch répond alors en redirigeant le navigateur Web de l'utilisateur vers l'URL de redirection, avec un code ajouté. Votre application Web lit ensuite ce code dans l'URL.

Si votre code est dans une application web, il sera en mesure de répondre à l'URL redirigé vers l'étape 3. Vous pouvez également être en mesure d'utiliser un contrôle WebBrowser (Windows Forms, WPF) pour gérer la connexion Twitch et gérer un événement Navigating. Si l'URL de destination commence par l'URL de redirection, extrayez le code de l'URL, annulez la navigation et masquez le contrôle du navigateur Web de connexion. La présence de ce qui semble être un contrôle RichTextBox, avec votre commentaire sur votre code étant une «petite application C#», me fait penser que votre code est une application Windows Forms ou WPF. Si tel est le cas, alors vous devez soit:

  • utiliser un contrôle WebBrowser comme je l'ai décrit ci-dessus,
  • Remplacez votre WinForms/app WPF avec une application web ou
  • entrer en contact avec Twitch pour demander l'utilisation du password flow (qui ne semble pas nécessiter de redirection), et l'utiliser à la place.
+0

Je le fais comme tu dis. Mais sache que je reçois le 403: interdit. Mais je suis sûr que c'est mon clientID et mon clientSecret correct. Parce que je le copie de mon canal Twitch. – Innoszorn

+0

@Innoszorn: Je pense que c'est un pas dans la bonne direction. Le serveur comprend maintenant votre requête mais refuse l'accès. Comment obtenez-vous le 'code'? Pourriez-vous s'il vous plaît modifier votre question pour inclure la méthode 'get_DownLoadString'? Aussi, comme mentionné dans le dernier paragraphe que j'ai écrit, y a-t-il un message dans le corps de la réponse? –

+0

J'ai inclus la méthode get_DownloadString. La partie du code: request.GetResponse() déclenche l'exception: 403: Interdit. – Innoszorn