如何让 Google 的 OAuth API 自动刷新令牌?

Posted

技术标签:

【中文标题】如何让 Google 的 OAuth API 自动刷新令牌?【英文标题】:How to get Google's OAuth API to refresh token automatically? 【发布时间】:2022-01-07 16:49:31 【问题描述】:

大家好!我有以下代码来设置我的 Google API:

                // Open the FileStream to the related file.
                using FileStream stream = new("Credentials.json", FileMode.Open, FileAccess.Read);

                // The file token.json stores the user's access and refresh tokens, and is created
                // automatically when the authorization flow completes for the first time.

                UserCredential credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.FromStream(stream).Secrets,
                    new[]  SheetsService.Scope.Spreadsheets, YouTubeService.Scope.YoutubeReadonly ,
                    "admin",
                    CancellationToken.None,
                    new FileDataStore("Token", true),
                    new PromptCodeReceiver()
                );

                // Create Google Sheets API service.
                builder.Services.AddSingleton(new SheetsService(new BaseClientService.Initializer()
                
                    HttpClientInitializer = credential,
                    ApplicationName = name,
                ));

                // Create Youtube API service.
                builder.Services.AddSingleton(new YouTubeService(new BaseClientService.Initializer()
                
                    HttpClientInitializer = credential,
                    ApplicationName = name,
                ));

使用此代码,我的所有服务都正确地注入到我正在使用的服务提供者中。但是,经过 7 天的 ASP.Net 网站似乎没有刷新令牌,即使我的令牌文件有一个刷新令牌。正如我想象的那样,这是因为 OAuth 令牌仅持续 7 天。

那么,如何让 Google 的 API 自动刷新我的令牌?由于这是一个网站,它需要长时间在线而不因令牌过期而停机。

【问题讨论】:

【参考方案1】:

如果您的应用仍在测试中,则刷新令牌会在 7 天后过期。要让它们过期更长时间,您需要将您的应用设置为生产环境,并可能对其进行验证。

Refresh token expiration

为外部用户类型配置了 OAuth 同意屏幕且发布状态为“正在测试”的 Google Cloud Platform 项目发出了一个在 7 天后到期的刷新令牌。

网络应用与已安装应用

我很惊讶您的代码托管在网站上。 GoogleWebAuthorizationBroker.AuthorizeAsync 适用于已安装的应用程序。它不适用于托管在网站上的 Asp .net。它不起作用的原因是它会导致同意浏览器在运行代码的机器上打开。这将在开发中起作用,但一旦您尝试将其托管在网络服务器上,它就无法正常工作,因为服务器无法生成本地网络浏览器。

你应该关注Web applications (ASP.NET Core 3)

哪个会使用依赖注入

public void ConfigureServices(IServiceCollection services)

    ...

    // This configures Google.Apis.Auth.AspNetCore3 for use in this app.
    services
        .AddAuthentication(o =>
        
            // This forces challenge results to be handled by Google OpenID Handler, so there's no
            // need to add an AccountController that emits challenges for Login.
            o.DefaultChallengeScheme = GoogleOpenIdConnectDefaults.AuthenticationScheme;
            // This forces forbid results to be handled by Google OpenID Handler, which checks if
            // extra scopes are required and does automatic incremental auth.
            o.DefaultForbidScheme = GoogleOpenIdConnectDefaults.AuthenticationScheme;
            // Default scheme that will handle everything else.
            // Once a user is authenticated, the OAuth2 token info is stored in cookies.
            o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        )
        .AddCookie()
        .AddGoogleOpenIdConnect(options =>
        
            options.ClientId = YOUR_CLIENT_ID;
            options.ClientSecret = YOUR_CLIENT_SECRET;
        );

      

您无需担心刷新访问令牌,库会为您处理。

【讨论】:

我明白了!就是这样,我相信它目前正在测试中。我现在就验证! 听到有关网络/已安装应用程序的信息真的很有趣,很好!以后可能省了很多麻烦哈哈。 专业提示:在完成验证过程之前,您将无法发布公开视频。【参考方案2】:

是不是让 ASP.NET 应用访问 Youtube 和 Sheets...

    代表最终用户 代表自己(不涉及最终用户?

在 (1) 的情况下,使用 GoogleWebAuthorizationBroker 启动 OAuth 授权流程是正确的方法,但您可能不应该永久存储刷新令牌。要么仅在最终用户会话期间存储它,要么根本不存储它并在每次访问令牌过期时触发新的 OAuth 授权流程。

在 (2) 的情况下,您应该使用服务帐户和load credentials by using GoogleCredentials.GetApplicationDefaultAsync()。如果应用在 Google Cloud 上运行,attach a service account to the underlying compute resource;如果它在其他地方运行you can use Workload identity federation or service account keys。

【讨论】:

刷新令牌用于离线访问,为什么您不将它们与用户登录信息一起存储在数据库中。您想在用户每次返回您的网站时征求他们的同意吗?这个问题的作者正在使用不支持服务帐户的 YouTube API。 (-1 表示不正确的信息。) 至少有一些 YouTube API 确实支持服务帐户。 YouTube 数据 API 均不支持服务帐户。如果您认为确实如此,请链接 API 和说明它的文档。我已经使用这些 API 11 年了,如果你能证明我错了,我会非常高兴。

以上是关于如何让 Google 的 OAuth API 自动刷新令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何让服务器访问Google Calendar API?

Google API Oauth php 永久访问

使用 Python / Django 的 Google API 示例的 Oauth

使用Javascript中的Oauth授权将Google表格API v3迁移到v4之后如何实现makeApiCall()方法

如何在没有 Oauth 的情况下访问 Google 客户端 API(仅 API 密钥)

如何使用 google-api-ruby-client People API 传递 OAuth 令牌?