使用带有C#的Google OAuth 2.0登录

我想允许用户使用Gmail登录。 所以,我用谷歌搜索并获得了许多样本,但都使用了OpenID,并且我检查了Google文档,他们已经停止了对OpenID的新域名注册,从现在开始,开发人员将需要使用OAuth API。

我已经注册了我的项目,并获得了Secrey KEY和客户ID。 现在我想将它集成到我的项目中,但我无法找到任何样本工作项目。

请帮我解决这个问题。 我没有使用MVC。

我正在使用Google+ API进行解释,该API使用Gmail ID登录。 因此,您将对用户进行身份validation,以便使用Gmail登录。

1:您需要启用Google+ API

Google+ API

2:打开Goog​​le+ API后,您需要添加新的Client ID

创建新的客户端ID

 Step 2 

Web应用程序客户端ID

 Step 3 

客户端ID,密钥和重定向URL

在步骤2中,当您添加重定向URL时,您需要在您希望用户重定向到的页面上添加您的网站的URL。

为Web应用程序创建客户端ID后。

然后在您的应用程序中,您需要添加两个包

 1: Newtonsoft.Json 

安装包Newtonsoft.Json

 2: Microsoft.Net.Http 

安装包Microsoft.Net.Http

现在添加这个命名空间;

 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; 

现在在代码中,首先在页面顶部声明这些变量;

 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; 

然后在你的页面加载事件;

 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(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"); } } } 

现在将调用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); } 

添加此GooglePlusAccessToken类;

 // 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; } } 

您还可以使用Access Token调用其他oauth API来检索一些用户信息。

 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(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; } } 

希望这是你正在寻找的,我实现了它,它工作得很好。 希望这可以帮助。

基于Google最新的DotNet API,我使用了以下代码,适用于Console App,Web Form和Asp.Net MVC。

  public async Task 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; } 

这里ClientId和ClientSecret存储在web.config文件中,如果需要,可以在以后轻松修改。