在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 }); } }