谷歌OAuth 2.0在WinForm上

本文关键字:WinForm OAuth 谷歌 | 更新日期: 2023-09-27 17:50:36

我迷路了,需要指路。我正在用WinForms开发一个非常小的应用程序,它使用了谷歌的API。为了能够获得用户数据,我需要获得他的用户名和密码,到目前为止,一切都可以工作,但是,我没有任何保存用户的能力。

现在,我不想每次都问用户名和密码,所以我想找到一种安全的方法。

我问了一个关于我应该把这个信息放在哪里的问题,得到的答案是保存用户名和密码不是一个好主意,我应该使用Google OAuth 2.0代替。

但是,我的问题是我需要使用谷歌OAuth 2.0的web浏览器,现在我不确定如何在我的WinForm应用程序中实现这一点。

我的问题:

  1. 是否可以从web浏览器获取数据到我的应用程序?
  2. 我应该寻找不同的方式来获取用户数据吗?(任何建议都会很棒)。

谷歌OAuth 2.0在WinForm上

您需要知道的两个最重要的信息是,您应该使用客户端库来为您完成工作,并且您应该使用"Installed application"流/客户端类型。

使用这里的教程,它指导你如何使用已安装的应用程序:https://code.google.com/p/google-api-dotnet-client/wiki/GettingStarted

你必须使用web浏览器从用户那里获得凭据,但是一旦你这样做了,你应该能够重用这些凭据(刷新令牌)而不需要重新提示。该库使得将这些凭据从浏览器移动到应用程序变得简单。

在非浏览器应用程序中执行OAuth2被称为"2-legged OAuth2"。

服务器端,3腿OAuth2用于浏览器身份验证。它由以下步骤组成:

  1. 应用程序导航到你的web应用程序
  2. 你的web应用程序重定向到OAuth2端点在谷歌与正确的get参数
  3. Google验证你的用户并使用用户令牌将浏览器重定向回你的web应用程序
  4. 您的web应用程序使用令牌连接到Google服务

客户端,2条腿的OAuth2包括在应用程序中托管WebBrowser控件,并遵循3条腿身份验证的步骤2-3:

  1. web浏览器控件转到Google中的OAuth2端点假装你的web应用将被认证
  2. web浏览器控件允许用户身份验证和重定向回您的web应用
  3. ,但你甚至没有真正的任何web应用程序-在重定向回你的应用程序,你捕获redirect事件的web浏览器控件和提取认证令牌

有了用户令牌,winforms应用程序代表用户连接到Google服务。

总之:您必须将注意力集中在客户端库中的OAuth 2.0中。

因此,文档中有非常好的描述和示例,您需要使用它们进行处理。

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

参考源码- google-api-dotnet-client OAuth2.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 "";
        }
    }