Login using Google OAuth 2.0 with C#

前端 未结 2 1806
天涯浪人
天涯浪人 2020-11-29 21:39

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 st

相关标签:
2条回答
  • 2020-11-29 22:20

    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.

    0 讨论(0)
  • 2020-11-29 22:20

    Based on Google lastest API for DotNet I have used below code which works for Console App, Web Form and Asp.Net MVC as well.

     public async Task<UserCredential> getUserCredential()
        {
            UserCredential credential;
            string[] scopes = new string[] {  }; // user basic profile
    
            //Read client id and client secret from Web config file
    
            credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                       new ClientSecrets
                       {
                           ClientId = ConfigurationManager.AppSettings["ClientId"],
                           ClientSecret = ConfigurationManager.AppSettings["ClientSecret"]
                       }, scopes,
                "user", CancellationToken.None, new FileDataStore("Auth.Api.Store"));
    
            return credential;
        }
    

    Here ClientId and ClientSecret stored in web.config file which can be modified later easily if requires.

    0 讨论(0)
提交回复
热议问题