2015-04-17 11 views
15

Il mio lavoro corrente consiste nel consumare un'API RESTful con OAuth2. Attualmente ho capito come ottenere il token di accesso e funziona bene mentre utilizzo l'estensione chrome Rest Console, ma quando provo a farlo dalla mia applicazione ottengo sempre l'errore che sto inviando una richiesta OAuth non valida. Qui sotto puoi vedere tre dei modi in cui ho provato a utilizzare l'API, ma senza successo. La pagina restituisce sempre l'errore 500. Qualsiasi aiuto sarà apprezzato, se mi fosse sfuggito qualcosa di cruciale.Errore 500 con autorizzazione durante il consumo del servizio RESTful OAuth2 tramite C#

var auth = "Bearer " + item.access_token; 


    /* First Attempt */ 
    var client = new RestClient("http://<link>"); 
    var request = new RestRequest("sample", Method.GET); 
    request.AddHeader("Authorization", auth); 
    request.AddHeader("Content-Type", "application/json;charset=UTF-8"); 
    request.AddHeader("Pragma", "no-cache"); 
    request.AddHeader("User-Agent", "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"); 
    request.AddHeader("Accept", "application/json"); 
    request.RequestFormat = DataFormat.Json; 
    var response = client.Execute(request); 
    var content = response.Content; 





    /* Second Attempt */ 
    string sURL = "http://<link>/sample"; 

    string result = ""; 

    using (WebClient client = new WebClient()) 
    { 
     client.Headers["Authorization"] = auth; 
     client.Headers["Content-Type"] = "application/json;charset=UTF-8"; 
     client.Headers["Pragma"] = "no-cache"; 
     client.Headers["User-Agent"] = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"; 
     client.Headers["Accept"] = "application/json"; 

     byte[] byteArray = Encoding.UTF8.GetBytes(parameters); 

     var result1 = client.DownloadString(sURL); 
    } 


    /* Third Attempt */ 
    var request = (HttpWebRequest)WebRequest.Create(sURL); 
    request.Method = "GET"; 
    request.ContentType = "application/json;charset=UTF-8"; 
    request.Accept = "application/json"; 
    request.Headers["Authorization"] = auth; 
    request.UserAgent = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"; 
    string content; 
    HttpStatusCode statusCode; 
    using (var response = request.GetResponse()) 
    using (var stream = response.GetResponseStream()) 
    { 
     var contentType = response.ContentType; 
     Encoding encoding = null; 
     if (contentType != null) 
     { 
      var match = Regex.Match(contentType, @"(?<=charset\=).*"); 
      if (match.Success) 
       encoding = Encoding.GetEncoding(match.ToString()); 
     } 

     encoding = encoding ?? Encoding.UTF8; 

     statusCode = ((HttpWebResponse)response).StatusCode; 
     using (var reader = new StreamReader(stream, encoding)) 
      content = reader.ReadToEnd(); 
    } 

-------- -------- EDIT

Per il primo tentativo ho anche provato ad aggiungere l'autenticazione al cliente variabile client.Authenticator = Authenticate; dove OAuth2AuthorizationRequestHeaderAuthenticator Authenticate = new OAuth2AuthorizationRequestHeaderAuthenticator(item.access_token, item.token_type);

+0

Se si sta veramente usando 'var auth =" Bearer "+ item.access_token;' invece dell'identificatore e del segreto del client per il recupero dei token? Da dove viene l'access_token se riesci solo a ottenere il codice di autorizzazione? Potresti anche provare a escludere le intestazioni "Pragma", "User-Agent" e "Accept", potrebbero non essere necessarie qui. – GeorgDangl

+0

Hai provato a fare clic con il pulsante destro del mouse su "Riferimenti" in Esplora soluzioni e utilizzando "Aggiungi riferimento servizio"? Potrebbe essere un grande aiuto e ridurre i tempi di programmazione. –

+0

item.accesss_token si è ottenuto in precedenza indirizzando un'altra parte della stessa API utilizzando il secondo tentativo scritto nel mio codice. È analizzato correttamente e se utilizzo il token ottenuto da questo con Rest Console, l'API funziona come previsto. Ho provato senza le intestazioni aggiuntive, ma non ha fatto alcuna differenza. Ho letto da qualche parte che posso passare access_token attraverso l'url, quindi ho provato a farlo, non ha funzionato. – user2227904

risposta

2

Il codice sembra giusto. I tentativi di errore che hai suggerito indicano che il problema riguarda il token e non il codice. I token bearer hanno un tempo di scadenza. Così semies come il tuo token è scaduto tra la prima volta che lo hai usato usando l'estensione chrome REST Console e quando hai scritto il tuo codice. Ma la strana situazione qui è il codice di errore 500 che hai ottenuto. 401 è la risposta standard quando il token è scaduto o non esiste. Il codice di errore 500 indica sempre un errore del server.

+0

Grazie, per la risposta rapida, ma il token non è un problema. Le due operazioni sono fatte una dopo l'altra. Ho appena ricevuto il token e provo a richiedere i dati dall'API, anche se uso lo stesso token che ho usato con questa richiesta in RestConsole (estensione di Chrome) tira i dati correttamente. Inoltre ho catturato le 2 richieste con Wireshark, ma non ho visto differenze, quindi penso che potrebbe esserci qualcosa di sbagliato nel mio codice. – user2227904

Problemi correlati