Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Login using Google OAuth 2.0 with C#

Tags:

c#

oauth

I want to allow User to login using Gmail. So, I googled and got many samples but all were using OpenID and as I have checked Google Documentation, they have stopped new domain registration for OpenID and from now, Developer will need to use OAuth API.

I have registered my Project and got Secrey KEY & Client ID. Now I want to integrate it my Project but I am unable to find any sample working Project.

Please help me regarding this. I am not using MVC.

like image 995
Jeeten Parmar Avatar asked Jun 05 '14 10:06

Jeeten Parmar


People also ask

Can OAuth be used as login?

OAuth is the underlying technology used for website authentication by sites that let users register or login using their account with another website such as Facebook, Twitter, LinkedIn, Google, GitHub or Bitbucket.

Is Google OAuth2 login?

Google APIs use the OAuth 2.0 protocol for authentication and authorization. Google supports common OAuth 2.0 scenarios such as those for web server, client-side, installed, and limited-input device applications.


1 Answers

I am explaining based on Google+ API, which uses Gmail ID to login. So, you will be authenticating your users to login with Gmail.

1: You need to turn on the Google+ API:

Google+ API

2: Once you turned on the Google+ API, then you need to add new Client ID.

Create New Client ID

Step 2 

Web Application Client ID

Step 3 

Client ID, Secret & Redirect URL

Here in Step 2, when you add Redirect URL, you will need to add the URL of your website on which page you want user to redirected to.

Once you have created your Client ID for Web Application.

Then in your application, you need to add two packages

1: Newtonsoft.Json 

Install-Package Newtonsoft.Json

2: Microsoft.Net.Http 

Install-Package Microsoft.Net.Http

Now add this namespaces;

using Newtonsoft.Json; using System.IO; using System.Net; using System.Net.Http; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; 

Now in code first your declare this variables at top of your page;

protected string googleplus_client_id = "458878619548-khuatamj3qpiccnsm4q6dbulf13jumva.apps.googleusercontent.com";    // Replace this with your Client ID protected string googleplus_client_secret = "4hiVJYlomswRd_PV5lyNQlfN";                                                // Replace this with your Client Secret protected string googleplus_redirect_url = "http://localhost:2443/Index.aspx";                                         // Replace this with your Redirect URL; Your Redirect URL from your developer.google application should match this URL. protected string Parameters; 

Then in you Page Load event;

protected void Page_Load(object sender, EventArgs e) {     if ((Session.Contents.Count > 0) && (Session["loginWith"] != null) && (Session["loginWith"].ToString() == "google"))     {         try         {             var url = Request.Url.Query;             if (url != "")             {                 string queryString = url.ToString();                 char[] delimiterChars = { '=' };                 string[] words = queryString.Split(delimiterChars);                 string code = words[1];                  if (code != null)                 {                     //get the access token                      HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token");                     webRequest.Method = "POST";                     Parameters = "code=" + code + "&client_id=" + googleplus_client_id + "&client_secret=" + googleplus_client_secret + "&redirect_uri=" + googleplus_redirect_url + "&grant_type=authorization_code";                     byte[] byteArray = Encoding.UTF8.GetBytes(Parameters);                     webRequest.ContentType = "application/x-www-form-urlencoded";                     webRequest.ContentLength = byteArray.Length;                     Stream postStream = webRequest.GetRequestStream();                     // Add the post data to the web request                     postStream.Write(byteArray, 0, byteArray.Length);                     postStream.Close();                      WebResponse response = webRequest.GetResponse();                     postStream = response.GetResponseStream();                     StreamReader reader = new StreamReader(postStream);                     string responseFromServer = reader.ReadToEnd();                      GooglePlusAccessToken serStatus = JsonConvert.DeserializeObject<GooglePlusAccessToken>(responseFromServer);                      if (serStatus != null)                     {                         string accessToken = string.Empty;                         accessToken = serStatus.access_token;                          if (!string.IsNullOrEmpty(accessToken))                         {                             // This is where you want to add the code if login is successful.                             // getgoogleplususerdataSer(accessToken);                         }                     }                  }             }         }         catch (Exception ex)         {             //throw new Exception(ex.Message, ex);             Response.Redirect("index.aspx");         }     } } 

Now the event that will call the google API

protected void Google_Click(object sender, EventArgs e) {      var Googleurl = "https://accounts.google.com/o/oauth2/auth?response_type=code&redirect_uri=" + googleplus_redirect_url + "&scope=https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile&client_id=" + googleplus_client_id;      Session["loginWith"] = "google";      Response.Redirect(Googleurl); } 

Add this GooglePlusAccessToken class;

// Google public class GooglePlusAccessToken {     public string access_token { get; set; }     public string token_type { get; set; }     public int expires_in { get; set; }     public string id_token { get; set; }     public string refresh_token { get; set; } } 

Also you can call other oauth API with the Access Token to retrieve some of users information.

private async void getgoogleplususerdataSer(string access_token) {     try     {         HttpClient client = new HttpClient();         var urlProfile = "https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + access_token;          client.CancelPendingRequests();         HttpResponseMessage output = await client.GetAsync(urlProfile);          if (output.IsSuccessStatusCode)         {             string outputData = await output.Content.ReadAsStringAsync();             GoogleUserOutputData serStatus = JsonConvert.DeserializeObject<GoogleUserOutputData>(outputData);              if (serStatus != null)             {                  // You will get the user information here.             }         }     }     catch (Exception ex)     {           //catching the exception     } }  public class GoogleUserOutputData {     public string id { get; set; }     public string name { get; set; }     public string given_name { get; set; }     public string email { get; set; }     public string picture { get; set; } } 

Hope this is what you were looking for, I implemented this and it is working just fine. Hope this helps.

like image 152
Vyas Avatar answered Sep 20 '22 22:09

Vyas