【问题标题】:Google Analytics OAuth with AccessType = Offline in C#Google Analytics OAuth with AccessType = Offline in C#
【发布时间】:2014-02-28 11:59:29
【问题描述】:

我想通过 OAuth 使用 Google Analytics API。

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

以下代码用于身份验证:

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 一起使用,这样我就不必每隔几天就接受授权请求吗?

类似于这个问题的答案: Service Account Google Analytics OAuth AccessType = Offline C#

【问题讨论】:

    标签: c# google-api-dotnet-client


    【解决方案1】:

    我只知道一种方法:您需要覆盖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

    我没有看到任何传递参数或替换AuthorizationCodeFlow的方法

    【讨论】:

    • 我们现在使用的是带有证书的服务帐户,它更容易设置,所以我没有尝试这种方法。不过,我将其标记为答案。
    • Dennis,您是否有关于如何设置您提到的“带有证书的服务帐户”的说明。我一直在尝试,但运气不佳。
    • 你拯救了我的一天。很好的帮助。
    • 非常非常有帮助,非常感谢。很遗憾,无法从 GoogleAuthorizationCodeFlow 将“AccessType”配置为 clientid、scope 等属性。(developers.google.com/accounts/docs/OAuth2WebServer#overview)
    • 顺便说一句,您不能使用“AuthorizationCodeFlow.Initializer 初始化程序”创建构造函数,它必须是“GoogleAuthorizationCodeFlow.Initialier”。
    【解决方案2】:

    显然我无法发表评论,但要扩展 Darida 的回答:

    制作您的自定义 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));
        }
    }
    

    然后在Controller中

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

    【讨论】:

    • 没有 MVC 怎么办?似乎每个示例都使用 MVC 而不仅仅是 Web API
    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-26
    • 2015-02-21
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多