谷歌OAuth 2.0在WinForm上
本文关键字:WinForm OAuth 谷歌 | 更新日期: 2023-09-27 17:50:36
我迷路了,需要指路。我正在用WinForms开发一个非常小的应用程序,它使用了谷歌的API。为了能够获得用户数据,我需要获得他的用户名和密码,到目前为止,一切都可以工作,但是,我没有任何保存用户的能力。
现在,我不想每次都问用户名和密码,所以我想找到一种安全的方法。
我问了一个关于我应该把这个信息放在哪里的问题,得到的答案是保存用户名和密码不是一个好主意,我应该使用Google OAuth 2.0代替。
但是,我的问题是我需要使用谷歌OAuth 2.0的web浏览器,现在我不确定如何在我的WinForm应用程序中实现这一点。
我的问题:
- 是否可以从web浏览器获取数据到我的应用程序?
- 我应该寻找不同的方式来获取用户数据吗?(任何建议都会很棒)。
您需要知道的两个最重要的信息是,您应该使用客户端库来为您完成工作,并且您应该使用"Installed application"流/客户端类型。
使用这里的教程,它指导你如何使用已安装的应用程序:https://code.google.com/p/google-api-dotnet-client/wiki/GettingStarted
你必须使用web浏览器从用户那里获得凭据,但是一旦你这样做了,你应该能够重用这些凭据(刷新令牌)而不需要重新提示。该库使得将这些凭据从浏览器移动到应用程序变得简单。
在非浏览器应用程序中执行OAuth2被称为"2-legged OAuth2"。
服务器端,3腿OAuth2用于浏览器身份验证。它由以下步骤组成:
- 应用程序导航到你的web应用程序
- 你的web应用程序重定向到OAuth2端点在谷歌与正确的get参数
- Google验证你的用户并使用用户令牌将浏览器重定向回你的web应用程序
- 您的web应用程序使用令牌连接到Google服务
客户端,2条腿的OAuth2包括在应用程序中托管WebBrowser
控件,并遵循3条腿身份验证的步骤2-3:
- web浏览器控件转到Google中的OAuth2端点假装你的web应用将被认证
- web浏览器控件允许用户身份验证和重定向回您的web应用
- ,但你甚至没有真正的任何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 "";
}
}