【问题标题】:Google OAuth2 email credentialsGoogle OAuth2 电子邮件凭据
【发布时间】:2021-12-14 14:59:18
【问题描述】:

我正在编写一个 Xamarin.Forms (C#) 移动应用程序。它适用于单个谷歌电子表格修改,只需几个按钮,每个按钮都会更改电子表格中的一个单元格。电子表格是私人的,只有几个人可以阅读或进行任何更改,这就是我需要在这里使用UserCredential credential; 的原因。我发现了两种方法,都抛出了不同的异常:

  1. credential = new UserCredential(new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer{ClientSecrets = GoogleClientSecrets.FromStream(...).Secrets, Scopes = new[]{...}, DataStore = new FileDataStore(..., true) }), "user", null);

  2. credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.FromStream(...).Secrets, new string[]{...}, "user", CancellationToken.None, new FileDataStore(..., true)).Result;

credential后来被设置为service对象的成员SheetsService.HttpClientInitializer,使用如下(选择的电子表格是公开的,spreadsheetIdrange取自Google的.Net quickstart:@ 987654321@):

string spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms", range = "Class Data!A2:E";
SpreadsheetsResource.ValuesResource.GetRequest request = service.Spreadsheets.Values.Get(spreadsheetId, range);
var resp = request.Execute();

例外:

  1. var resp = request.Execute(); 行抛出System.NullReferenceException(我发现Google.Apis.Requests.ClientServiceRequest 基类中的属性Credentialnull

  2. AuthorizeAsync 方法抛出异常并显示以下消息:

无法使用“https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&resp...”启动浏览器

P.S.:我也尝试过 GoogleCredential 方法,它适用于公共电子表格,但我的“服务”甚至没有权限阅读这个私人电子表格......

【问题讨论】:

  • 此链接(stackoverflow.com/questions/64445242/…) 可能对您有所帮助。
  • @WenxuLi-MSFT :谢谢链接,但我没有找到 Xamarin 项目的答案(仅参考谷歌文档,我最初检查过)
  • 有类似“redirect uri mismatch”的问题吗?
  • @WenxuLi-MSFT nope :( 但我查看了调试输出,发现以下错误(?):“AOT: image 'Mono.Security.dll.so ' not found: dlopen failed” 我尝试的第一步是向 Android 项目添加“Mono.Security”引用(没有结果),然后我还检查了“System.Security”(相同),..
  • @DaImTo - 不,我一直使用“GoogleCredential”,只是将服务地址添加到可以修改电子表格的私人列表中......

标签: c# xamarin.forms google-oauth google-sheets-api


【解决方案1】:

使用 Google 客户端库的典型模式是首先初始化一个 服务 对象,然后使用该对象创建请求:

new XxxxService(new BaseClientService.Initializer
{
  HttpClientInitializer = credential
}

对于表格,应如下所示:

var resource = new SpreadsheetsResource(
  new SheetsService(new BaseClientService.Initializer
  {
    HttpClientInitializer = credential
  });

resource.Get(...)

【讨论】:

  • 谢谢,对于一个帖子,但这不是问题的答案,如何“使用”凭证不是这里的问题(正如我在后记中所写,GoogleCredential 对象工作正常)。
猜你喜欢
  • 2016-06-08
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 2018-09-24
  • 1970-01-01
  • 2011-01-24
  • 2019-02-03
相关资源
最近更新 更多