WinForm上的Google OAuth 2.0

3
我需要一些指引,因为我有点迷失了方向。我正在WinForms中开发一个非常小的应用程序,它使用Google API。为了能够访问用户数据,我需要获取他的用户名和密码,到目前为止,一切都很顺利,但是我没有任何保存用户的能力。
现在,我不想每次都询问用户的用户名和密码,所以我正在尝试找到安全的方法来实现这一点。
我在问题上询问了应该把这些信息放在哪里,并得到了答案,即保存用户名和密码不是一个好主意,我应该使用Google OAuth 2.0。
但是,我的问题是我需要使用Web浏览器来进行Google OAuth 2.0,现在我不确定如何在我的WinForm应用程序中实现这一点。
我的问题:
1. 是否可以从Web浏览器中获取数据到我的应用程序中?
2. 我应该寻找其他获取用户数据的方法吗?(任何建议都将是很好的)。
4个回答

2
您需要知道的两个最重要的信息是:您应该使用客户端库来为您完成工作,您应该使用“已安装应用程序”流/客户端类型。
请使用此处的教程,它将指导您如何使用已安装应用程序: https://code.google.com/p/google-api-dotnet-client/wiki/GettingStarted 您确实需要使用Web浏览器从用户那里获取凭据,但一旦您这样做了,您就应该能够重新使用这些凭据(刷新令牌)而无需重新提示。该库使得将这些凭据从浏览器移动到您的应用程序变得简单。

1
在非浏览器应用程序中执行OAuth2被称为“2-legged OAuth2”。
服务器端的3-legged OAuth2用于浏览器身份验证。它包括以下步骤:
1. 应用程序导航到您的Web应用程序 2. 您的Web应用程序使用正确的获取参数重定向到Google的OAuth2端点 3. Google对用户进行身份验证并将浏览器重定向回您的Web应用程序,带有用户令牌 4. 您的Web应用程序使用令牌连接到Google服务
客户端的2-legged OAuth2包括在应用程序中托管WebBrowser控件,并遵循3-legged身份验证的第2-3步:
1. Web浏览器控件进入Google的OAuth2端点,假装您的Web应用程序将被验证 2. Web浏览器控件允许用户进行身份验证并重定向回您的Web应用程序 3. 但实际上您甚至没有任何Web应用程序 - 在重定向回应用程序时,您捕获Web浏览器控件的重定向事件并提取身份验证令牌
拥有用户令牌后,WinForms应用程序代表用户连接到Google服务。

当你处理OAuth2并且传统上在OAuth1中使用的术语时,“2对3条腿的方法”并不是真正相关的。在OAuth2中,有涉及用户和不涉及用户的流程。在Google术语中,除了服务帐户之外的所有流程都涉及获取用户的许可。这个问题涉及到用户的凭据,因此选择是Web应用程序、已安装的应用程序或客户端流。Soner想要已安装的应用程序。 - David Primmer

0

下面是一个示例代码,可以获取用户的邮件(以及一些基本信息)。你可以将其保存在程序设置中或者按照你的需求进行处理。

using System;
using System.Text;
using Newtonsoft.Json;
using System.IO;
using System.Net.Http;
using System.Threading;
using Google.Apis.Auth.OAuth2;

    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; }
    }
    static string[] Scopes = { "https://www.googleapis.com/auth/userinfo.email" };
    // conversie stream <=> string : https://www.csharp411.com/c-convert-string-to-stream-and-stream-to-string/
    private static string Secrets = "your streamdata - converted with code from the above site, from the json-file you got from Google";

    public static string GoogleLogin()
    {
        try
        {
            byte[] ByteArray = Encoding.ASCII.GetBytes(Secrets);
            GoogleClientSecrets GSecrets = GoogleClientSecrets.FromStream(new MemoryStream(ByteArray));
            UserCredential UserCredentials = GoogleWebAuthorizationBroker.AuthorizeAsync(GSecrets.Secrets, Scopes, "user", CancellationToken.None).Result;

            HttpClient client = new HttpClient();
            var urlProfile = "https://www.googleapis.com/oauth2/v1/userinfo?access_token=" + UserCredentials.Token.AccessToken;
            HttpResponseMessage output = client.GetAsync(urlProfile).Result;
            GoogleUserOutputData userdata = null;
            if (output.IsSuccessStatusCode)
            {
                string outputData = output.Content.ReadAsStringAsync().Result;
                userdata = JsonConvert.DeserializeObject<GoogleUserOutputData>(outputData);
            }

            if (userdata != null)
                return userdata.email;
            else return "";
        }
        catch (Exception Exception)
        {
            return "";
        }
    }

0

简而言之:你需要专注于客户端库中的OAuth 2.0。

因此,文档中有非常好的描述和示例,您需要按照这些进行处理。

虽然某些服务根本不需要身份验证,或仅使用您的开发者密钥,但大多数服务需要访问一些用户数据。用于访问用户数据的身份验证模型是OAuth2.0。

源参考链接 - google-api-dotnet-client OAuth2.0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接