使用带有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
:
2:打开Google+ API后,您需要添加新的Client ID
。
Step 2
Step 3
在步骤2中,当您添加重定向URL时,您需要在您希望用户重定向到的页面上添加您的网站的URL。
为Web应用程序创建客户端ID后。
然后在您的应用程序中,您需要添加两个包
1: Newtonsoft.Json
2: 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文件中,如果需要,可以在以后轻松修改。