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

Posted

技术标签:

【中文标题】使用带有 C# 的 Google OAuth 2.0 登录【英文标题】:Login using Google OAuth 2.0 with C# 【发布时间】:2014-07-26 07:31:37 【问题描述】:

我想允许用户使用Gmail 登录。因此,我在 Google 上搜索并获得了许多示例,但所有示例都使用 OpenID,并且我检查了 Google 文档,他们已停止为 OpenID 注册新域,从现在开始,开发人员将需要使用 OAuth API。 我已经注册了我的项目并获得了 Secrey KEY 和客户 ID。现在我想将它集成到我的项目中,但我找不到任何示例工作项目。 请帮助我解决这个问题。我没有使用 MVC。

【问题讨论】:

OAuth Google 我认为不需要客户 ID 和密钥。 @ArijitMukherjee,它需要像 facebook。 @ArijitMukherjee,不。 GoogleUserOutputData 有哪些属性?即,您是否有类似 GooglePlusAccessToken 类的描述? @PerG,它具有所有通用的公开属性。 【参考方案1】:

我基于 Google+ API 进行解释,它使用 Gmail ID 登录。因此,您将验证您的用户以使用 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<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");
        
    

现在是调用 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<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; 

希望这就是您想要的,我实现了它并且它工作得很好。 希望这会有所帮助。

【讨论】:

非常感谢您提供的简短详细信息。我会检查它,如果我得到完美的数据,那么我会将你的帖子标记为答案。 嘿,我遇到了一些错误,但最后我解决了它并获得了所有数据。再次感谢你。 :) 太棒了。很高兴这有帮助。 我已经编辑了答案,GoogleUserOutputData 是一个访问通过调用 google api 返回的数据的类......在我们的场景中,我已经编辑并显示了我们从调用 google 获得的响应api. 谢谢你。我遇到了异步和无效等问题。相反,我使用了同步:WebClient client = new WebClient(); string downloadString = client.DownloadString(urlProfile);【参考方案2】:

基于 Google 最新的 DotNet API,我使用了以下代码,该代码也适用于控制台应用程序、Web 表单和 Asp.Net MVC。

 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;
    

此处 ClientId 和 ClientSecret 存储在 web.config 文件中,以后可以根据需要轻松修改。

【讨论】:

这会返回错误:无法使用“accounts.google.com/o/oauth2/v2/…”启动浏览器进行授权。有关详细信息,请参阅内部异常。 而内部异常:Access denied。我从我的 ASP.NET 应用程序(服务器端)尝试了一些选项,但没有运气。谷歌文档很烂。 dotnetexample.in/2018/02/login-using-google-api-with-c.html?m=1 如果您错过任何配置,请查看此内容 是的,我遵循的所有这些步骤都没有运气。似乎只适用于 IIS Express,但是当我尝试使用 IIS 中的站点时,会出现错误,尽管所有权限都是正确的 如果您的文件中有客户端 ID 或客户端密码。您的应用程序应该有权访问该路径,以便在您发布到 IIS 时应用程序可以读取它。通过使用托管站点的“测试设置”进行验证,检查当前用户或 IUSR 是否可以访问物理路径 第三个参数中“user”应该用什么代替?

以上是关于使用带有 C# 的 Google OAuth 2.0 登录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用带有服务帐户的 gmail api 或 google Oauth 来发送邮件?

带有 Google Analytics API v3 的 OAuth 2.0

使用新 oAuth 1.0 的 Google Ads API、C#、SOAP 请求?

带有 Google 的 OAuth2 - CORS 错误(Angular + Spring boot)[重复]

在 C# 中使用 google OAuth2 后如何获取电子邮件?

带有 Google Play 游戏服务的 OAuth 令牌