我想允许用户使用Gmail登录.所以,我google了很多样本,但都使用OpenID,而且我检查了Google文档,他们已经停止了对OpenID的新域名注册,从现在起,开发人员将需要使用OAuth API.
我已经注册了我的项目,并获得了Secrey KEY&客户端ID.现在我想将它整合到我的项目中,但是我无法找到任何示例工程项目.
请帮我解决这个问题.我没有使用MVC.
我已经注册了我的项目,并获得了Secrey KEY&客户端ID.现在我想将它整合到我的项目中,但是我无法找到任何示例工程项目.
请帮我解决这个问题.我没有使用MVC.
解决方法
我正在基于Google API进行解释,该API使用Gmail ID进行登录.所以,您将验证您的用户使用Gmail登录.
1:您需要启用Google API:
2:打开Google API后,您需要添加新的客户端ID.
Step 2
Step 3
在步骤2中,当您添加重定向网址时,您需要将用户要重定向到的网页的网址添加到网站.
为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_sceret = "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) { if (Session["loginWith"] != null) { if (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_sceret + "&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,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); } else { } } else { } } else { } } } 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=" +RedirctedUri+ "&scope=https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile&client_id=" + ClientId; 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; } }
还可以使用访问令牌调用其他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<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; } }
希望这是你正在寻找的,我实现了这一点,它的工作正常.希望这可以帮助.