按照此处发布的上一个问题,我正在尝试使用服务器应用程序中的日历服务。
我“自己”管理身份验证流程并将用户的访问令牌和刷新令牌存储在数据库中。现在我想我可以使用 .NET 客户端示例中显示的方法来使用CalendarService. 但我仍然想知道该IAuthorizationState GetAuthorization(WebServerClient client)方法的最佳实现是什么,以便仅在需要时才请求刷新访问令牌。我当前的幼稚实现每次都会刷新令牌:
private IAuthorizationState GetAuthorization(WebServerClient client)
{
IAuthorizationState state = new AuthorizationState(new[] { "profile", CalendarService.Scopes.Calendar.GetStringValue() });
state.AccessToken = _accessToken;
state.RefreshToken = _refreshToken;
client.RefreshToken(state);
return state;
}
Run Code Online (Sandbox Code Playgroud)
...但我相信有更聪明的方法来做到这一点!
提前致谢。
c# authentication oauth-2.0 google-oauth google-api-dotnet-client
我希望有人可以帮助我。
请看下面的源代码。结束时单击“执行”。我将收到以下错误:
未处理Google.Apis.Auth.OAuth2.Responses.TokenResponseException _HResult = -2146233088 _message =错误:“ access_denied”,说明:“未授权请求的客户端。”,Uri:“”
我已经尝试了很多东西。创建用户,列表组等(具有正确的作用域)等,但是每次遇到相同的错误时。
我已经创建了一个服务帐户,并且Google Developers Console中的所有API都设置为“ on”。我用于模拟的用户是完全管理员。
我尝试了几件事,但是我必须做一些愚蠢的事情。该代码看起来很像Stack Overflow上的另一个问题:Google Admin SDK无法创建用户-禁止例外403, 但是我的代码无法正常工作。谁能告诉我我忘记了什么?
private static readonly string[] Scopes = new string[] { DirectoryService.Scope.AdminDirectoryUser, DirectoryService.Scope.AdminDirectoryGroup, DirectoryService.Scope.AdminDirectoryGroupMember };
static void Main(string[] args)
{
String serviceAccountEmail = "***@developer.gserviceaccount.com";
var certificate = new X509Certificate2(@"file.p12", "notasecret", X509KeyStorageFlags.Exportable);
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = Scopes,
User = "admin email address",
}.FromCertificate(certificate));
var service = new DirectoryService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "User Provisioning", …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过C#API将简单图像上传到Google云存储.它似乎成功了,但我的Google云端存储桶中没有任何内容.
我到目前为止的代码:
Google.Apis.Services.BaseClientService.Initializer init = new Google.Apis.Services.BaseClientService.Initializer();
init.ApiKey = "@@myapikey@@";
init.ApplicationName = "@@myapplicationname@@";
Google.Apis.Storage.v1.StorageService ss = new Google.Apis.Storage.v1.StorageService(init);
var fileobj = new Google.Apis.Storage.v1.Data.Object()
{
Bucket = "images",
Name = "some-file-" + new Random().Next(1, 666)
};
Stream stream = null;
stream = new MemoryStream(img);
Google.Apis.Storage.v1.ObjectsResource.InsertMediaUpload insmedia;
insmedia = new Google.Apis.Storage.v1.ObjectsResource.InsertMediaUpload(ss, fileobj, "images", stream, "image/jpeg");
insmedia.Upload();
response.message = img.Length.ToString();
Run Code Online (Sandbox Code Playgroud) 我想对工作表和Google驱动器api使用相同的OAuth代码和令牌,而无需将工作表和驱动器重定向到第2页。
以下是使用oauth 2生成访问代码和令牌的代码
string SCOPE = "https://spreadsheets.google.com/feeds https://docs.google.com/feeds";
OAuth2Parameters parameters = new OAuth2Parameters();
parameters.ClientId = CLIENT_ID;
parameters.ClientSecret = CLIENT_SECRET;
parameters.RedirectUri = REDIRECT_URI;
parameters.Scope = SCOPE;
string authorizationUrl = OAuthUtil.CreateOAuth2AuthorizationUrl(parameters);
OAuthUtil.GetAccessToken(parameters);
string accessToken = parameters.AccessToken;
Run Code Online (Sandbox Code Playgroud)
就像在asp.net mvc中一样,它是通过重定向Google表格API生成的。
我也想使用Google Drive API来获得相同的令牌。
我如何才能为Google Drive API 创建凭据对象,以便与其一起使用。遵循代码打开另一个窗口并将代码发送到该窗口。
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets
{
ClientId = clientId,
ClientSecret = clientSecret
}, scopes, "skhan", CancellationToken.None, new FileDataStore("Drive.Auth.Store")).Result;
Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc oauth google-drive-api google-api-dotnet-client
我开始探索 Gmail API。我按照教程显示标签列表(https://developers.google.com/gmail/api/quickstart/dotnet),并且工作正常。
高度赞赏帮助
当我修改程序流程时,它给了我错误。我无法追踪错误。它给了我方法错误Execute()。
错误:值“= Get Labels google-api-dotnet-client/1.25.0.0 (gzip)”的格式无效
这是我的代码。
public static class Labels
{
public static void ListLabels ( )
{
try
{
var scope = new [] { GmailService.Scope.GmailReadonly };
var service = Authorization.GetGmailService(scope, "AppName = Get Labels");
if (service != null)
{
var requestListLabels = service.Users.Labels.List("me");
var labelsList = requestListLabels.Execute().Labels;
Console .WriteLine ( "\n\n---- Labels List ----" );
if ( labelsList != null && labelsList .Count > 0 )
{
foreach ( …Run Code Online (Sandbox Code Playgroud) 我尝试遵循此处列出的简单示例:https ://developers.google.com/admin-sdk/directory/v1/quickstart/dotnet
不同之处在于我生成了一个服务帐户凭据,并将其分配为具有角色项目所有者的委托,因此它具有完全访问权限。我还为它分配了适当的作用域名称空间。
在这里它可以访问Orgunits,这就是我试图在 Directory API 中列出的内容
这是我定义的服务帐户
这是我的凭据
我下载了凭证的 JSON 并将其添加到我的项目中。我可以通过检查调试器确认代码加载 ServiceAccountCredential 并成功进行身份验证并获取访问令牌。
但随后我将凭据传递给服务初始化程序,当我创建并执行请求时,它会失败并显示
{"Google.Apis.Requests.RequestError\r\nLogin Required [401]\r\nErrors [\r\n\tMessage[Login Required] Location[Authorization - header] Reason[required] Domain[global]\r\n]\r\n"}
Run Code Online (Sandbox Code Playgroud)
这是代码:
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using System;
using System.Collections.Generic;
using System.IO;
namespace DirectoryQuickstart
{
class Program
{
static string[] Scopes = { DirectoryService.Scope.AdminDirectoryUser, DirectoryService.Scope.AdminDirectoryOrgunit };
static string ApplicationName = "slea-crm";
static string Secret = "gsuite-secret.json";
static void Main(string[] args)
{
ServiceAccountCredential sac = GoogleCredential.FromFile(Secret).CreateScoped(Scopes).UnderlyingCredential as ServiceAccountCredential;
var token = sac.GetAccessTokenForRequestAsync().Result;
// Create …Run Code Online (Sandbox Code Playgroud) google-api google-oauth google-api-dotnet-client google-admin-sdk google-workspace
我正在尝试使用 Google 的 .Net 客户端库 (Analytics v3) 通过我的 GA 服务帐户获取数据。一切工作正常,除了在向 GA API(使用客户端库)发出请求期间偶尔会出现超时。我想调整超时逻辑(如果可能的话,通过库添加重试逻辑 - 但这是一个较小的问题)。
目前我无法弄清楚如何通过客户端库修改超时设置。通过阅读他们的源代码(因为我在 .net 方面找不到任何类似有用的文档),看起来我需要实现“IConfigurableHttpClientInitializer”。下面是我想到的一个示例,但我不确定它是否正确或如何将其与我现有的代码集成。下面还摘录了我的相关代码。
设置超时的类
public class TimeoutInitializer : IConfigurableHttpClientInitializer
{
public void Initialize(ConfigurableHttpClient httpClient)
{
httpClient.Timeout = TimeSpan.FromMinutes(3);
}
}
Run Code Online (Sandbox Code Playgroud)
现有代码
private async Task<GaData> GetAnalyticsData(string profileId, DateTime begin, DateTime end, string metrics, string dimensions)
{
GoogleCredential credential = AnalyticsHelper.GetCredentials(options.GoogleAnalyticsOptions);
var service = new AnalyticsService(new BaseClientService.Initializer() { HttpClientInitializer = credential });
DataResource.GaResource.GetRequest request = service.Data.Ga.Get($"ga:{profileId}", AnalyticsHelper.FormatDate(begin), AnalyticsHelper.FormatDate(end), metrics);
if (!string.IsNullOrEmpty(dimensions))
{
request.Dimensions = dimensions;
}
return await …Run Code Online (Sandbox Code Playgroud) 我正在尝试扩展它以用于同一公司内的多个用户.所有用户都将拥有该公司管理的Google帐户,并且我将为整个公司提供gsuite服务帐户.如何使用gsuite服务帐户根据电子邮件地址将文件上传到用户个人Google云端硬盘?
c# ×6
google-api ×3
google-oauth ×2
.net ×1
asp.net-core ×1
asp.net-mvc ×1
gmail-api ×1
oauth ×1
oauth-2.0 ×1