在C#中使用AccessType = Offline的Google Analytics OAuth

我想使用OAuth使用Google AnalyticsAPI。

我正在使用此库: http : //code.google.com/p/google-api-dotnet-client/

以下代码用于身份validation:

var credential = GoogleWebAuthorizationBroker.AuthorizeAsync( new ClientSecrets { ClientId = "...", ClientSecret = "..." }, new[] {Google.Apis.Analytics.v3.AnalyticsService.Scope.AnalyticsReadonly}, "user", CancellationToken.None, new FileDataStore("Analytics.Auth.Store")).Result; var service = new Google.Apis.Analytics.v3.AnalyticsService( new BaseClientService.Initializer { HttpClientInitializer = credential, ApplicationName = "...", }); 

我可以将它与refresh_token一起使用,这样我就不必每隔几天就接受一次授权请求吗?

类似于这个问题的答案: 服务帐户Google Analytics OAuth AccessType =离线C#

我只知道一种方法:你需要覆盖GoogleAuthorizationCodeRequestUrl ,但我不知道如何在AuthorizationBroker使用它。

 internal class ForceOfflineGoogleAuthorizationCodeFlow : GoogleAuthorizationCodeFlow { public ForceOfflineGoogleAuthorizationCodeFlow(AuthorizationCodeFlow.Initializer initializer) : base(initializer) { } public override AuthorizationCodeRequestUrl CreateAuthorizationCodeRequest(string redirectUri) { return new GoogleAuthorizationCodeRequestUrl(new Uri(AuthorizationServerUrl)) { ClientId = ClientSecrets.ClientId, Scope = string.Join(" ", Scopes), RedirectUri = redirectUri, AccessType = "offline", ApprovalPrompt = "force" }; } }; 

看起来他们在经纪人中创建了Flow: GoogleWebAuthorizationBroker.cs

我没有看到任何方式传递params或替换AuthorizationCodeFlow

显然我不能评论,但延伸到达里达的答案:

制作自定义CodeFlow

 public class CustomAuthorizationCodeFlow : GoogleAuthorizationCodeFlow { public CustomAuthorizationCodeFlow(GoogleAuthorizationCodeFlow.Initializer initializer) : base(initializer) { } public override AuthorizationCodeRequestUrl CreateAuthorizationCodeRequest(String redirectUri) { return new GoogleAuthorizationCodeRequestUrl(new Uri(AuthorizationServerUrl)) { ClientId = ClientSecrets.ClientId, Scope = string.Join(" ", Scopes), RedirectUri = redirectUri, AccessType = "online", ApprovalPrompt = "auto" }; } } 

然后制作自定义FlowMetadata

 public class AppFlowMetadata : FlowMetadata { private static readonly IAuthorizationCodeFlow flow = new CustomAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer { ClientSecrets = new ClientSecrets { ClientId = "...", ClientSecret = "..." }, Scopes = new String[] { AnalyticsService.Scope.AnalyticsReadonly }, DataStore = new EFDataStore(), }); public override IAuthorizationCodeFlow Flow { get { return flow; } } public override String GetUserId(Controller controller) { // In this sample we use the session to store the user identifiers. // That's not the best practice, because you should have a logic to identify // a user. You might want to use "OpenID Connect". // You can read more about the protocol in the following link: // https://developers.google.com/accounts/docs/OAuth2Login. return String.Format("user-{0}", WebSecurity.GetUserId(controller.User.Identity.Name)); } } 

然后在控制器中

 public ActionResult Sample() { var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).AuthorizeAsync(cancellationToken); if (result.Credential != null) { var service = new AnalyticsService(new BaseClientService.Initializer() { HttpClientInitializer = result.Credential, ApplicationName = APPLICATION_NAME }); } }