Search code examples
c#google-apigoogle-plusaccess-tokenbad-request

how to get Google plus access token in windows application C#.net


I am preparing a windows application in that I want to use oAuth2 to access info from google plus.

But I am getting bad request for my following code.. I am able to create app in google console and fetch the "code" for application access.

WebRequest request = WebRequest.Create(
    GoogleAuthenticationServer.Description.TokenEndpoint
);

        // You must use POST for the code exchange.
        request.Method = "POST";

        // Create POST data.
        string postData = FormPostData(code);
        byte[] byteArray = Encoding.UTF8.`enter code here`GetBytes(postData);

        // Set up the POST request for the code exchange.
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = byteArray.Length;
        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();

        // Perform the POST and retrieve the server response with
        // the access token and/or the refresh token.
        WebResponse response = request.GetResponse();
        dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        string responseFromServer = reader.ReadToEnd();
        reader.Close();
        dataStream.Close();
        response.Close();

        // Convert the response JSON to an object and return it.
        return JsonConvert.DeserializeObject<OAuthResponseObject>(
            responseFromServer);

Now, I am trying to use that code to get the access token. .which is giving me BAD request.

I also followed few post on stackoverflow. but none of them working for me.

Thanks

EDIT:

Thanks for the reply. I was able to do it my own somehow :)


Solution

  • I was able to do it my own using following code..

        private void button2_Click(object sender, EventArgs e)
        {
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token");
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.Method = "POST";
            authLink.AppendFormat("code={0}", code);
            authLink.AppendFormat("&client_id={0}", "996688211762.apps.googleusercontent.com");
            authLink.AppendFormat("&client_secret={0}", "nprfJuBUOyU2hsb3tqt1XDnB");
            authLink.AppendFormat("&redirect_uri={0}", "urn:ietf:wg:oauth:2.0:oob");
            authLink.Append("&grant_type=authorization_code");
            UTF8Encoding utfenc = new UTF8Encoding();
            byte[] bytes = utfenc.GetBytes(authLink.ToString());
            Stream os = null;
            try // send the post
            {
                webRequest.ContentLength = bytes.Length; // Count bytes to send
                os = webRequest.GetRequestStream();
                os.Write(bytes, 0, bytes.Length);        // Send it
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            try // get the response
            {
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                if (webResponse == null) { MessageBox.Show("null"); }
                StreamReader sr = new StreamReader(webResponse.GetResponseStream());
                textBox1.Text = sr.ReadToEnd().Trim();
                //MessageBox.Show(sr.ReadToEnd().Trim());
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            StringBuilder authLink = new StringBuilder();
            authLink.Append("https://accounts.google.com/o/oauth2/auth");
            authLink.AppendFormat("?scope={0}", "https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile");
            authLink.AppendFormat("&client_id={0}", "xxxxxx.apps.googleusercontent.com");
            authLink.AppendFormat("&redirect_uri={0}", "urn:ietf:wg:oauth:2.0:oob");
            authLink.Append("&response_type=code");
            string u = @"https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=xxxxxxxx.apps.googleusercontent.com";
            webBrowser1.Navigate(u);
        }
    

    I am assuming to have two button on window.. button1 is used to get CODE from google and button2 uses that code and get the access_token which is what I was looking for.