2014-07-11 3 views
0

Lorsque j'effectue une demande Web simple vers cette URL à l'aide de l'objet WebClient (ou de toute méthode de requête HTTP standard utilisant le framework .NET), j'obtiens une erreur 400 Bad Request Request. Quand j'ai essayé avec CURL, j'obtiens une réponse valide du serveur Web. Il semble que Google n'aime pas une demande de Windows - quelque chose le rejette.Demande incorrecte Obtention d'un jeton d'accès Google

Cela fonctionne dans https://developers.google.com/oauthplayground/ et cela fonctionne aussi si je crée juste un formulaire de Web et fais un poteau - j'obtiens un jeton d'accès dos aucun problème.

Mais j'ai besoin de pouvoir le faire par programmation. J'ai également essayé WebRequest et l'objet HTTP mais je n'ai pas vraiment eu de chance de travailler avec eux.

J'ai trouvé environ 4-5 questions similaires ici et certains d'entre eux ont un exemple de code - j'ai essayé leur code mais je n'ai pas eu de chance. (Code that I have tried)

Fonction GetAccessToken (Code ByVal As String, ByVal sScopes As String) Comme ActionResult Dim sAccessURLTokenURL As String = "https://accounts.google.com/o/oauth2/token"

Dim oWebCLient As New WebClient 

Dim oNameValueCollection As New NameValueCollection 

Dim oResponse() As Byte 

oWebCLient.Headers.Add("Content-type", "application/x-www-form-urlencoded; charset=utf-8") 

oNameValueCollection.Add("client_id", "562344623411-b2mt2215qdfs34asdqwe345jmq2ec7su.apps.googleusercontent.com") 
oNameValueCollection.Add("client_secret", "KjsPkBUTosdeROuVfkKBaAwm") 
oNameValueCollection.Add("code", Code) 
oNameValueCollection.Add("scopes", sScopes) 
oNameValueCollection.Add("grant_type", "authorization_code") 

oResponse = oWebCLient.UploadValues(sAccessURLTokenURL, oNameValueCollection) 

End Function 

Qu'est-ce que je fais mal ici?

Mettre à jour

nettoiera le code et après avec quelques explications

+0

Si ce sont votre vrai numéro de client et secret, vous devez Rese les ed. –

+0

Merci Eric - ceux-ci ne sont pas réels. Ils sont la même longueur cependant. Bon à regarder, monsieur! –

+0

Très bien! J'ai tendance à voir beaucoup de gens publier des informations sensibles sur SO, l'un des pires endroits pour le faire. –

Répondre

0
Imports System.Web 
Imports System.IO 
Imports System.Net 

Imports System.Text 

Public Class OAuth2Utilities 

Protected msTokenAuthorizationURL As String = "https://accounts.google.com/o/oauth2/token" 

Public Function ExchangeAuthorizationCodeForTokens(ByVal oAuth2Model As oAuth2Model) As String 
    Dim oWebResponse As WebResponse 
    Dim sWebResponse As String 

    If Not oAuth2Model Is Nothing Then 

     oWebResponse = GetWebResponse(oAuth2Model) 

     If Not oWebResponse Is Nothing Then 

      sWebResponse = ReadWebResponse(oWebResponse) 

     End If 

    End If 

    Return sWebResponse 
End Function 

Protected Function GetWebResponse(ByVal oAuth2Model As oAuth2Model) As WebResponse 
    Dim oWebResponse As WebResponse = Nothing 

    Dim oWebRequest As WebRequest 

    Dim sRequestParameters As String 
    Dim oRequestParametersByteArray() As Byte 

    Dim oUTF8Encoding As New UTF8Encoding() 

    Dim oStream As Stream 

    If Not oAuth2Model Is Nothing Then 

     oWebRequest = WebRequest.Create(msTokenAuthorizationURL) 

     oWebRequest.Method = "POST" 
     oWebRequest.ContentType = "application/x-www-form-urlencoded" 

     sRequestParameters = String.Format("code={0}&client_id={1}&client_secret={2}&redirect_uri={3}&grant_type=authorization_code", oAuth2Model.AuthorizationCode, oAuth2Model.ClientID, oAuth2Model.ClientSecret, oAuth2Model.RedirectURI) 

     oRequestParametersByteArray = oUTF8Encoding.GetBytes(sRequestParameters) 

     If oRequestParametersByteArray.Length > 0 Then 

      oWebRequest.ContentLength = oRequestParametersByteArray.Length 

      oStream = oWebRequest.GetRequestStream() 
      oStream.Write(oRequestParametersByteArray, 0, oRequestParametersByteArray.Length) 

      If Not oStream Is Nothing Then 

       oWebResponse = oWebRequest.GetResponse() 

      End If 
     End If 
    End If 

    Return oWebResponse 
End Function 

Protected Function ReadWebResponse(ByVal oWebResponse As WebResponse) As String 
    Dim sWebResponse As String = String.Empty 

    Dim oStream As Stream 
    Dim oStreamReader As StreamReader 

    Try 

     If IsNothing(oWebResponse) = False Then 

      oStream = oWebResponse.GetResponseStream() 

      If IsNothing(oStream) = False Then 

       oStreamReader = New StreamReader(oStream) 

       If Not oStreamReader Is Nothing Then 

        oStreamReader = New StreamReader(oStream) 

        If IsNothing(oStreamReader) = False Then 

         sWebResponse = oStreamReader.ReadToEnd() 

        End If 

       End If 

      End If 

     End If 

    Catch oException As Exception 

    End Try 

    Return sWebResponse 
End Function 

End Class 

J'ai commencé à travailler. Il est ce que le problème était, les gens. Je voudrais générer le code d'autorisation et jouerait avec lui pendant des heures en essayant de voir ce que je reçois de mauvaise demande.

La chose est (merci à Rich Sutton's Answer here) qu'une fois que vous ne semble pas être en mesure d'obtenir le jeton d'accès /Actualiser Token en utilisant le même code d'autorisation après la date initiale de le faire.

Voici votre ami par la voie - Google OAuth 2.0 Playground

otherwords:

  1. vous allez générer le code d'autorisation en mettant sur pied une URL passant ClientID, ClientSecret et Rediriger URI (plus ce que les paramètres que vous voulez passer)
  2. Si vos données sont vous récupérerez un code d'autorisation
0

Je suppose que vous devez définir la méthode et le type de contenu, car la réponse du serveur indique que: mauvaise demande. Donc, je suppose que le réglage du type de contenu à application/x-www-form-urlencoded; charset=utf-8 et la méthode à POST fonctionnera. Pour ce faire:

oWebCLient.Headers.Add("Content-type", "application/x-www-form-urlencoded; charset=utf-8") 
oWebClient.UploadValues(sAccessURLTokenURL, "POST", oNameValueCollection) 

Webclient, pour autant que je sache, utilise GET comme méthode par défaut, donc je pense que le problème que vous rencontrez ... Pouvez-vous essayer s'il vous plaît?

MISE À JOUR

Grossistes:

oWebClient.Encoding = System.Text.Encoding.UTF8 
oWebClient.Proxy = Nothign 

type de contenu est NEEDE ne pas être définie si vous utilisez UploadValues car il sera réglé sur application/x-www-form-urlencoded automatiquement. Il n'est pas clair dans les documents que le jeu de caractères peut être défini via les en-têtes. De plus, si le serveur Google détecte un paramètre invalide, il renverra automatiquement une demande incorrecte, ce qui signifie que vous avez probablement une erreur dans les paramètres ou que vous appelez uri. Pourriez-vous coller le code complet qui ne fonctionne pas? Peut-être que je pourrais être en mesure de mieux vous aider.

J'espère que ça aide!

+0

Il retourne toujours la mauvaise demande 400. Je peux le faire avec Curl ou WebForm ainsi que certains outils POST en ligne et cela fonctionne très bien et l'obtient - Je crois qu'il ya quelque chose qui ne me permet pas de l'accomplir. Je continuerai à essayer! –

+0

Mis à jour, désolé pour le retard! – ZeroWorks

+0

Merci encore! Je pense que je l'ai maintenant! J'apprécie vos efforts et votre aide, monsieur! –

Questions connexes